异常的继承结构
异常在Java中以类和对象的形式存在。
下面是异常的结构:
Object下面有Throwable;
Throwable下面有两个分支:
- Error(不可处理,直接退出JVM)
- Exception(可处理的);
Exception下面有两个分支:- RuntimeException,运行时异常。
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。 - 编译异常(非运行时异常)
Exception中除RuntimeException及其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。
- RuntimeException,运行时异常。
运行时异常vs编译异常
运行时异常发生的概率一般比较低。没有必要进行预处理。
编译时异常发生的概率一般比较高。对于一些发生概率比较高的异常,需要在运行前对其进行处理。
注意:
编译时异常和运行时异常,都发生在运行阶段。只有程序运行期间才可以new对象,异常的发生就是new异常对象。
Java中对异常的处理方式
throws
在方法声明的位置上,使用throws关键字,抛给上一级(谁调用我,我就抛给谁)
上抛类似于推卸责任,继续把异常传递给调用者。
只要异常没有捕捉,采用上报的方式,此方法的后续代码不会继续执行。
注意:
Java中发生异常以后,如果一直上抛,最终抛给了main方法,main方法继续上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果——终止Java程序的执行。
try…catch
使用try…catch语句进行异常的捕获。这件事情发生了,谁也不知道,因为我给抓住了。
捕捉等于把异常拦下了,异常真正得到解决了,调用者是不知道的。
try语句块中的某一行出现异常,则该行后面的代码不会执行。try…catch捕捉异常之后,后续代码可以执行。
异常对象的常用方法
如何取得异常对象的具体信息,常用的方法主要有两种:
- 取得异常描述信息:
getMessage()
- 取得异常的堆栈信息(比较适合于程序调试阶段):
printStackTrace()
;