异常概述
异常是指在程序运行过程中所发生的不正常事件,如所需文件找不到、算术运算出错、数组下标越界、装在一个不存在的类等。
异常体系结构
所有异常都是Throwable类的子类,它派生了两个子类:Error类和Exception类。
Error类:表示仅靠程序本省无法恢复的严重错误,如内存溢出、动态链接失败、虚拟机错误。
Exception类:有java应用程序抛出和处理的非常严重错误,如所需文件找不到,网络连接不通,算术运算出错。Exception又可分为两大异常类。
运行时异常:RunntimeException及其子类。
特点:不要求程序必须对它们进行处理
非运行时异常:Checked异常,除了运行时异常外的其他从Exception类继承来的异常。
特点:必须处理。
java的异常处理:使用 try - catch 处理异常
把可能出现异常的代码块放入 try 块里面,并使用 catch 语句块进行异常的捕获。
如果 try 块里面的代码正常执行完毕,那么 catch 语句块中的内容会被忽略。
如果 try 块里面的代码发生异常,并且与 catch 语句块中声明的异常类型匹配,那么 try 语句块中的剩余代码将会被忽略,而相应的 catch 语句块中的代码会被执行。
如果 try 块里面的代码发生异常,而抛出的异常在catch 语句块中没有声明,那么方法立刻退出。
调用异常对象的方法输出异常信息,常用方法:
void printStackTrace():输出异常的堆栈信息。
String getMessage():返回异常信息描述字符串,描述了异常产生的原因,是printStackTrace()输出信息的一部分。
使用 try - catch - finally 处理异常
try - catch - finally 和 try - catch 类似,只不过无论是否发生异常,finally 语句块中的代码都会被执行。
try - catch - finally 结构中 try 语句块是必须存在的,catch 、 finally 是可选的,但必须存在其一。
即使 try 语句块中有return 语句,finally 语句块也会执行,finally 语句块唯一不执行的情况是使用System.exit(1) 让整个程序终止,退出java虚拟机。
try - catch语句可以嵌套使用,也可以使用多重catch处理异常。
使用throws声明抛出异常
throws声明某个方法可能抛出的各种异常以通知调用者。可以同时声明多个异常,之间用逗号隔开。
通过try - catch 捕获异常并处理。
通过throws继续声明异常,让上一级调用者处理异常。main()方法声明的议程将由java虚拟机来处理。
使用 throw 抛出异常
在编程中除了系统自动发现异常外,在编程过程中有些问题是系统无法自动发现发现并解决的,这个时候就需要程序员来自行的抛出异常,把问题提交给调用者去解决。
throw 和 throws的区别
作用不同:
throw用于程序员自行产生并抛出异常
throws用于声明该方法内部抛出异常
使用的位置不同:
throw位于方法体内部,可以作为单独语句使用
throws必须跟在方法参数列表后面,不能单独使用
内容不同:
throw抛出一个异常对象,只能是一个
throws后面跟异常类,可以跟多个
自定义异常
定义异常类,并继承Exception或者RuntimeException
编写异常类的构造方法,并继承父类的实现
实例化自定义异常对象,并在使用过程中使用throw抛出
异常链
A方法调用B方法,B方法却抛出了异常,nameA方法时继续抛出原有的异常还是抛出一个新的异常呢?若抛出原有的异常,那么A方法和B方法就进行了关联,不便于代码的修改和扩展。若抛出新的异常,虽然解决了关联的问题,但是原有异常信息会丢失。JDK1.4推出了异常链,正好解决这个问题,他虽创建了新的异常,但却保留了原有的异常。