My Blog

Exception

记录 exception class

学习笔记,仅供参考

参考B站Mirco_Frank - java 进阶 | 官方教程


Exception

异常指一个在程序执行过程中产生的事件,它打断了程序的正常执行过程,从而使程序终止运行。要是能处理掉异常,程序就不会终止,那么后面的程序就可以被执行到

异常的继承图如下:

Exception extend map

异常的分类

  • 检查异常(Checked Exception) : 除了 Error 和 RuntimeException 及其子类外,其他的类都是检查异常,像 IOException、FileNotFoundException等。检查异常会在编译时就报错,所以必须要处理或抛出该异常,否则编译无法通过

  • 错误(Error) : Error 及其子类,编译时无法判断出,只有在运行时才会报错且终止程序。通常是由硬件或系统级错误,所以较异常要更严重些。

  • 运行时异常(RuntimeException) : RuntimeException 及其子类,编译无法判断,只有运行时才会检查到,出错时会自动抛出异常,所以并非一定要处理异常。通常是由逻辑错误或 API 运用不当导致的

异常的捕获和处理

处理异常会用到 try, catch, finally 三种代码块

try {
    // 用 try 包住可能有异常的代码,以此来捕获异常
    code
} catch (异常类型 异常变量名) {
    // 若是捕获到异常,就执行 catch 中的语句,一般为一些报错信息
    handle exception statements
} catch (ExceptionTyle name) {
    // catch 可以有多个,可以用来捕获不同类型的异常
    statements
} finally {
    // 无论是否有异常都会执行此内容,很适合用来清理或关流
    code
}

/*******************example******************/

// ★ 注意多重异常捕获时,父类异常要放在子类的后面,否则会报错

try {
    code
} catch (IndexOutOfBoundsException e) {
    System.out.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
    System.out.println("IOException: " + e.getMessage());
}

// 多个 catch 的缩写
try {
    code
} catch (IndexOutOfBoundsException | IOException ex) {
    ex.printStackTrack();
}
// 但这样写后,ex 变量就变为 final 型,之后不能再被赋值

抛出异常

有异常时,可以选择处理,还可以选择不处理,将异常抛给上一级,上一级也可选择处理或抛出,直到某一级处理或抛给 JVM 来处理(终止程序, 打印信息)

如除法函数中,要是除数为零,抛出异常

public class Test {
    public static void main(String arg[]) throws Exception {
        division(1, 0);
    }
    
    // division method
    public void division(int x, int y) throws Exception {
        if (0 == y) {
            // throw exception
            throw new Exception("Shit! / by zero");
        } 

        System.out.println(x / y);
    }
}

若抛出的是 RuntimeException,在方法名后面就不用声明异常的类型;若是非 Runtime 类的则 必须 要用 throws ExceptionType 来声明有异常

异常的好处

通过异常可以判断出是什么样的异常,在哪里有异常,从而根据所给的异常信息和网络文档来进行代码的修改