JAVA 异常情况如何处理?
Java 异常类层次结构?
Throwable 是 Java 语言中所有错误与异常的超类。
Error 类及其子类:程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
Exception 程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常。
运行时异常
都是 RuntimeException 类及其子类异常,如 NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是 Java 编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用 try-catch 语句捕获它,也没有用 throws 子句声明抛出它,也会编译通过。
非运行时异常 (编译异常)
是 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException、SQLException 等以及用户自定义的 Exception 异常,一般情况下不自定义检查异常。
可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)区别?
可查异常(编译器要求必须处置的异常):
正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。
除了 RuntimeException 及其子类以外,其他的 Exception 类及其子类都属于可查异常。这种异常的特点是 Java 编译器会检查它,也就是说,当程序中可能出现这类异常,要么用 try-catch 语句捕获它,要么用 throws 子句声明抛出它,否则编译不会通过。
不可查异常(编译器不要求强制处置的异常)
包括运行时异常(RuntimeException 与其子类)和错误(Error)。
throw 和 throws 的区别?
异常的申明(throws)
在 Java 中,当前执行的语句必属于某个方法,Java 解释器调用 main 方法执行开始执行程序。若方法中存在检查异常,如果不对其捕获,那必须在方法头中显式声明该异常,以便于告知方法调用者此方法有异常,需要进行处理。 在方法中声明一个异常,方法头中使用关键字 throws,后面接上要声明的异常。若声明多个异常,则使用逗号分割。如下所示:
异常的抛出(throw)
如果代码可能会引发某种错误,可以创建一个合适的异常类实例并抛出它,这就是抛出异常。如下所示:
Java 7 的 try-with-resource?
如果你的资源实现了 AutoCloseable 接口,你可以使用这个语法。大多数的 Java 标准资源都继承了这个接口。当你在 try 子句中打开资源,资源会在 try 代码块执行后或异常处理后自动关闭。
异常的底层?
提到 JVM 处理异常的机制,就需要提及 Exception Table,以下称为异常表。我们暂且不急于介绍异常表,先看一个简单的 Java 处理异常的小例子。
使用 javap 来分析这段代码(需要先使用 javac 编译)
看到上面的代码,应该会有会心一笑,因为终于看到了 Exception table,也就是我们要研究的异常表。
异常表中包含了一个或多个异常处理者(Exception Handler)的信息,这些信息包含如下
from 可能发生异常的起始点
to 可能发生异常的结束点
target 上述 from 和 to 之前发生异常后的异常处理者的位置
type 异常处理者处理的异常的类信息
如若转载,请注明出处:开源字节 https://sourcebyte.cn/article/122.html
评论