Java异常

Java异常

下图是Java异常层次结构图:

在Java中,所有的异常都有一个公共父类Throwable,其有两个重要的子类Error错误和Exception异常。其中,Error大多是虚拟机层面发生的错误,是程序无法处理的错误;而Exception则是用户程序可以捕获或可以处理的异常。Exception可以分为运行时异常RuntimeException和非运行时异常;又可以分为不受检查异常Unchecked Exception和检查异常Checked Exception

Exception中有一个重要的子类运行时异常RuntimeException,常见的异常如空指针异常NullPointerException、算数异常ArithmeticException、数组下标越界异常ArrayIndexOutOfBoundsException、丢失资源异常MissingResourceException、找不到类异常ClassNotFoundException和参数异常IllegalArgumentsException等。这些异常都是不检查异常,程序可以选择捕获处理也可以选择不处理。而RuntimeException之外的异常都是检查异常,必须选择try-catch进行捕获或者throws进行抛出,否则通不过编译。

Java异常处理

Java异常处理本质上是抛出异常和捕获异常。

运行时异常由Java运行时系统自动抛出,允许程序忽略。而对于所有的检查异常,必须进行捕获处理或者抛出给它的调用者,如IOException

  • 捕获异常

    通过try-catch-finally语句块进行捕获异常。可能发生异常的代码块放在try中,并使用catch进行捕获发生的异常,可以选择使用finally块进行资源的关闭,因为finally块中的代码一定会被执行。

    注意有多个catch语句时,异常会依次进行检查,直到被匹配。因此异常要先小后大,先子类后父类。

  • 抛出异常

    抛出异常分为手动抛出和系统抛出。

    程序中可以使用throw关键字手动抛出异常。对于不受检查异常,系统会自动抛出异常。

    如果在一个方法中可能导致一个异常但不处理,则必须在方法声明处使用throws指出抛出异常的列表。

    *如果是不受检查异常Unchecked Exception,如ErrorRuntimeException,那么可以不使用throws关键字来声明抛出的异常,在运行时系统会自动抛出。 *

    如果是检查异常Checked Exception,则必须选择进行try-catch捕获处理或者throws抛出。否则无法通过编译。

-------------本文结束感谢您的阅读-------------