[Java核心技术] Java异常和异常处理
![[Java核心技术] Java异常和异常处理 /java07/featured-image.png](/java07/featured-image.png)
                    目录
                    
                
                
            Java 核心技术读书笔记——Java异常和异常处理
1 Java异常分类
异常:程序不正常的行为或者状态
Throwable
所有错误的祖先
Error
系统内部错误或者资源耗尽,可以不用处理。
Exception
程序有关异常,重点关注。
- RuntimeException:程序自身的错误- 5/0,空指针,数组越界…
 
- 非RuntimeException:外界相关的错误- 打开一个不存在文件
- 加载一个不存在的类
 
- Unchecked Exception:(编译器不会辅助检查的,需要程序员自己管的)异常,包括- Error子类和- RuntimeException子类。
- 非RuntimeException的Exception的子类:(编译器会辅助检查的)异常,checked exception。
- 注意:编译器会检查程序是否为checked exception配置了处理。如果没有处理,会报错。
2 Java异常处理
- 允许用户及时保存结果
- 抓住异常,分析异常内容
- 控制程序返回到安全状态
try-catch-finally
- 一种保护代码正常运行的机制
- try:正常业务逻辑代码。
- catch:当try发生异常,将执行catch代码。若无异常,则绕之。
- finally:当try或catch执行结束后,必须要执行finally。
 
- 异常结构
- try...catch(catch可以有多个,下同)
- try...catch...finally
- try...finally
 
- try必须有,- catch和- finally至少要有一个
- catch块可以有多个,每个有不同的入口形参。当已发生的异常和某一个- catch块中的形参类型一致,那么将执行该- catch块中的代码。如果没有一个匹配,- catch也不会被触发。最后都进入- finally块。
- 进入catch块后,并不会返回到try发生异常的位置,也不会执行后续的catch块,一个异常只能进入一个catch块。
- catch块的异常匹配是从上而下进行匹配,所以一般是将小的异常写在前面,而一些大(宽泛)的异常则写在末尾。
- try-catch-finally每个模块里面也会发生异常,所以也可以在内部继续写一个完整的- try结构。
throws
- 方法存在可能异常的语句,但不处理,那么可以使用throws来声明异常。
- 调用带有throws异常(checked exception)的方法,要么处理这些异常,或者再次向外throws,直到main函数为止。
|  |  | 
覆盖/继承
- 一个方法被覆盖,覆盖它的所有方法必须抛出相同的异常,或者异常的子类。
- 如果父类的方法抛出多个异常,那么重写的子类方法必须抛出那些异常的子集,也就是不能抛出新的异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16// Father.java public class Father { public void f1() throws ArithmeticException { } } // Son.java public class Son extends Father { public void f1() throws IOException // error { //子类重写方法, //所抛出的异常不能超出父类规定的范围 } }
3 自定义异常
- 自定义异常,需要继承Exception类或者子类- 继承自Exception,就变成Checked Exception
- 继承自RuntimeException,就变成UncheckedException
 
- 继承自
- 自定义重点在构造函数
- 调用父类Exception的message构造函数
- 可以自定义自己的成员变量
 
- 调用父类
- 在程序中采用throw主动抛出异常
|  |  |