java异常处理机制
try语句块用来包含可能出错的代码片段
catch用来捕获并处理对应的异常,可以定义多个,也可以合并多个异常在一个catch中。
异常处理机制中的finally
- finally块定义在异常处理机制中的最后一块。它可以直接跟在try之后,或者最后一个catch之后。
- finally可以保证只要程序执行到了try语句块中,无论try语句块中的代码是否出现异常,最终finally都必定执行。
- finally通常用来做释放资源这类操作。
- /**
- * finally块
- * finally块是异常处理机制中的最后一块,它可以直接跟在try语句块之后或者最后一个catch块
- * 之后。
- * finally可以保证只要程序执行到try语句块中,无论try语句块中的代码是否出现异常,finally
- * 都【必定执行】!
- * 通常finally块用于做释放资源这类操作,比如IO操作后的关闭流动作就非常适合在finally中进行
- */
-
- public class FinallyDemo {
-
- public static void main(String[] args) {
-
- System.out.println("程序开始了...");
-
- try{
-
- String str = "abc";
-
- System.out.println(str.length());
-
- return;
-
- }catch(Exception e){
-
- System.out.println("出错了,并处理了");
-
- }finally{
-
- System.out.println("finally中的代码执行了!");
-
- }
-
- System.out.println("程序结束了");
-
- }
-
- }
自动关闭特性
JDK7之后,java提供了一个新的特性:自动关闭。旨在IO操作中可以更简洁的使用异常处理机制完成最后的close操作。
语法:
try(
定义需要在finally中调用close()方法关闭的对象.
){
IO操作
}catch(XXXException e){
...
}
上述语法中可在try的"()"中定义的并初始化的对象必须实现了java.io.AutoCloseable接口,否则编译不通过.
throw关键字
throw用来对外主动抛出一个异常,通常下面两种情况我们主动对外抛出异常:
- /**
- * 测试异常的抛出
- */
-
- public class Person {
-
- private int age;
-
-
-
- public int getAge() {
-
- return age;
-
- }
-
-
-
- public void setAge(int age) throws Exception {
-
- if(age<0||age>100){
-
- //使用throw对外抛出一个异常
-
- throw new RuntimeException("年龄不合法!");
-
- }
-
- this.age = age;
-
- }
-
- }
当一个方法中使用throw抛出一个非RuntimeException的异常时,就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常,否则编译不通过。
当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理这个异常,否则编译不通过。 处理手段有两种:
- public class ThrowDemo {
-
- public static void main(String[] args){
-
- System.out.println("程序开始了...");
-
- try {
-
- Person p = new Person();
-
- /*
- 当我们调用一个含有throws声明异常抛出的方法时,编译器要求
- 我们必须添加处理异常的手段,否则编译不通过.而处理手段有两种
- 1:使用try-catch捕获并处理异常
- 2:在当前方法上继续使用throws声明该异常的抛出
- 具体用哪种取决于异常处理的责任问题
- */
-
- p.setAge(100000);//典型的符合语法,但是不符合业务逻辑要求
-
- System.out.println("此人年龄:"+p.getAge()+"岁");
-
- } catch (Exception e) {
-
- e.printStackTrace();
-
- }
-
-
-
- System.out.println("程序结束了...");
-
- }
-
- }
永远不应当在main方法上使用throws
含有throws的方法被子类重写时的规则
- import java.awt.*;
-
- import java.io.FileNotFoundException;
-
- import java.io.IOException;
-
- import java.sql.SQLException;
-
-
-
- /**
- * 子类重写超类含有throws声明异常抛出的方法时对throws的几种特殊的重写规则
- */
-
- public class ThrowsDemo {
-
- public void dosome()throws IOException, AWTException {}
-
- }
-
- class SubClass extends ThrowsDemo{
-
- // public void dosome()throws IOException, AWTException {}
-
-
-
- //可以不再抛出任何异常
-
- // public void dosome(){}
-
-
-
- //可以仅抛出部分异常
-
- // public void dosome()throws IOException {}
-
-
-
- //可以抛出超类方法抛出异常的子类型异常
-
- // public void dosome()throws FileNotFoundException {}
-
-
-
- //不允许抛出额外异常(超类方法中没有的,并且没有继承关系的异常)
-
- // public void dosome()throws SQLException {}
-
-
-
- //不可以抛出超类方法抛出异常的超类型异常
-
- // public void dosome()throws Exception {}
-
- }