第27 章 : 异常的捕获及处理

116 认识异常对程序的影响

出现错误后,程序中断执行
为了保证程序出现非致命错误之后,程序依然可以正常完成
异常处理机制保证程序的顺利执行

117 处理异常

语法

try{

} catch(异常类型 异常对象){
    // 处理异常

} catch(异常类型 异常对象){
    // 处理异常
}
...
finally{
    // 不管是否出现异常都会执行
}

异常

System.out.println(2/0);
// java.lang.ArithmeticException: / by zero

异常捕获

try{
    System.out.println(2/0);
}
catch(ArithmeticException e){
    System.out.println(e);
    // java.lang.ArithmeticException: / by zero
}

打印完成的异常信息
printStackTrace()

try{
    System.out.println(2/0);
}
catch(ArithmeticException e){
    e.printStackTrace();
    // java.lang.ArithmeticException: / by zero
    // at Demo.main(Demo.java:4)
}

118 处理多个异常

如果明确知道会发生什么异常,可以使用if做判断

119 异常处理流程

Error 程序还未执行性出现的错误,开发者无法处理
Exception 程序中出现的异常,开发者可以处理

异常体系

Object
    -Throwable
        -Exception

所有异常都可以用 Exception 处理
捕获范围大的异常要放在最后

120 throws关键字

告诉调用者可能会出现的异常
如果主方法继续抛出异常,表示此异常交由JVM处理

class Demo{

    public static int div(int x, int y) throws ArithmeticException{
        return x / y;
    }

    public static void main(String[] args) {
        try{
            int x = div(1, 0) ;
        }catch(ArithmeticException e){
            e.printStackTrace();
        }

    }
}

121 throw关键字

手动抛出异常

try{
    throw new Exception("主动抛出异常");
}catch(Exception e){
    e.printStackTrace();
    // java.lang.Exception: 主动抛出异常
}

区别:throw & throws
throw 在代码块中使用,主动抛出异常对象
throws 在方法定义上使用,明确告诉调用者可能产生的异常

122 异常处理模型

try{
    result = x / y;
} catch(Exception e){
    throw e;
}finally{
    System.out.println("结束...");
}

简化写法

try{
    result = x / y;
} finally{
    System.out.println("结束...");
}

123 RuntimeException

函数定义标注了可能抛出的异常,不过并没有要求强制处理

区别 RuntimeException & Exception
RuntimeException 是 Exception子类
RuntimeException 子类不要求强制处理异常
Exception 必须处理

124 自定义异常类

继承 RuntimeException(可选处理),Exception(必须处理)

// 如果继承自Exception 
// 错误: 未报告的异常错误MyException; 必须对其进行捕获或声明以便抛出
class MyException extends RuntimeException{
    public MyException(String message){
        super(message);
    }
}

class Demo{
    public static void main(String[] args) {
        throw new  MyException("自定义异常");
        // Exception in thread "main" MyException: 自定义异常
    }
}

125 assert断言

JDK >= 1.4
确定代码执行到某行之后,一定是所期待的结果
不一定是准确的,也可能出现偏差,但是这种偏差不应该影响程序的正常执行

Java中的断言需要指定运行参数才生效

int x = 9 ;
assert x == 10;

编译运行没有任何结果

启用断言

java -ea Demo

程序抛出异常

Exception in thread "main" java.lang.AssertionError