第一章、异常
1.1异常概念
-
异常:指的是程序在执行过程中,出现非正常的情况,最终会导致JVM的非正常停止。
-
在java等面线对象的编程语言中,异常本身就是一个类,产生的异常就是创建异常对象并抛出异常对象。
-
Java处理异常的方式是中断处理。
1.2、异常体系
(1)异常其实是帮助程序员找到程序中的问题。
- 根类:Java.lang.Throwable
- 子类:Java.lang.Error与Java.lang.Exception
(2)Throwable体系
Error:严重错误,无法通过处理的错误。
- 代码产生必须修改的错误(ps:定义过大的数组产生内存溢出异常)
Exception:表示异常,异常产生后程序员可以通过代码方式纠正。
- 编译期异常:编写过程中出现异常
- 运行期异常(RunTimeException及其子类):编译通过,执行过程出现异常。
1.3、异常过程解析
第二章、异常处理
2.1、抛出异常throw
(1)作用:使用throw关键字在指定的方法中抛出指定的异常。
- 异常抛出不处理:throw关键字后创建的是运行期异常,不处理时默认交给JVM,JVM会打印到控制台并中断程序。
- 异常抛出处理:throw关键字后创建的是编译期异常,要么 try…catch…,要么throw抛出交由其他部分程序处理。
(2)声明格式
throw new xxxException(“异常产生原因”);
(3)注意事项
- throw必须使用在方法体内
- throw后必须是Exception或者Exception的子类
2.2、声明异常throws
(1)作用:抛出异常,在方法层面上声明throw抛出的异常并交由调用者处理。
(2)声明格式
修饰符 返回值 方法名(参数列表) throws 异常原因{
throw new xxxException;
throw new bbbException;
}
(3)注意事项
- 编译期异常因为必须要处理,抛出后可以不解决,但需要在方法声明时声明异常,交给调用者处理。
- 方法内存在多个抛出异常时,方法声明时需要全部声明;如异常存在继承关系,则只需要写其父类即可。
- 如果调用了声明异常的方法,则调用者必须去处理该异常。
2.3、捕获异常try…catch
(1)作用:自己处理异常
(2)声明格式
//对象变量名接受出现的相应类型异常对象
try{
可能出现异常的代码;
}catch(异常类型1 对象变量名1){
异常处理代码;
}
...
catch(异常类型2 对象变量名2){
异常处理代码;
}
(3)注意事项:
- try中可能出现多个异常,就可以使用多个catch处理异常。
- 如果try未出现异常,程序忽略catch继续执行后续代码。
- 如果try出现异常,程序执行相应异常catch块内的代码后,继续执行程序。
2.4、Throwable异常处理方法
(1)方法
String getMessage();//获取异常的最简略信息
String toString();//获取异常的详细字符串,比getMessage方法多了异常原因
void printStackTrace();//获取异常的最详细信息(JVM打印异常对象的默认方法)
2.5、finally代码块
(1)作用:改代码块内代码一定会执行
(2)声明格式
try{
可能出现异常的代码;
}catch(异常类型1 对象变量名1){
异常处理代码;
}
...
catch(异常类型2 对象变量名2){
异常处理代码;
}finally{
必须执行代码块;
}
(3)注意事项
- finally必须与try一起使用。
- 多用于资源回收。
2.6、异常注意事项
(1)多异常捕获处理
-
多个异常分别处理
分别try…catch…语句处理可能出现异常的代码。
-
多个异常一次捕获,多次处理
try包含所有可能出现异常的代码,交给多个catch块进行处理。
多catch块内异常对象必须是子类在上,父类在下。
-
多个异常一次捕获一次处理
try包含所有可能出现异常的代码,交给一个声明Exception对象的catch块进行处理。
(2)finally有return语句
- finally有return语句,永远返回finally中的结果,避免这样书写。
2.8、自定义异常类
(1)声明格式
public class 异常类名 extend Exception | RunTimeException{
无参构造方法;
全参构造方法;
}
(2)注意事项
-
自定义异常类类名一般以Exception结尾
-
自定义异常,必须继承Exception或者RunTimeException
继承Exception:为编译期异常
继承RunTimeException:为运行期异常
(3)代码实例