Exception
1. 异常处理的理想目标
通知用户发生了错误
保存当前的工作结果
允许用户妥善的退出程序
2. 异常处理的任务
转移程序的控制权:Exception——>Exception Handler
3. 异常处理的大致流程
方法立即退出,剩余代码不执行,不返回值
调用该方法的代码也无法执行
搜索Exception Handler处理异常
4. 异常的层次结构和分类
Throwable = Error + Exception ( IOException +RuntimeException )
Error:Java运行时系统的内部错误和资源耗尽错误,不可控的错误
RuntimeException:程序错误,程序员的错误,
IOException:其他异常
Unchecked Exception:Error +RuntimeException
Checked Exception:IOException
编译器将核查是否为所有Checked Exception提供了 Exception Handler,否则报错
5. 异常的动作:声明,抛出,捕获
声明throws:
当调用一个抛出已检查异常的方法
当方法本身抛出已检查异常
抛出throw:
当程序运行过程中发现错误
光抛出不处理,要声明
既抛出又处理,即捕获
捕获try-catch:
捕获了异常,异常不被抛出到方法之外,也就无须声明
6. 创建自己的异常类
1. 默认构造器
2. 带有描述信息的构造器
7. 传递异常( 声明throws )还是处理异常( 捕获try-catch )?
后果:如果一个异常不被捕获,程序(线程)将终止执行,控制台打印异常信息。
若方法A调用了一个抛出已检查异常的方法B,要么在方法A中处理;要么方法A传递给更高层的调用者。
到底是传递还是处理,取决于方法A是否具备处理能力
8. 如果子类覆写超类方法,则子类方法声明的已检查异常不能比父类更通用,换句话说,不允许在子类的throws说明符中出现超过父类方法所列出的异常范围。
愈通用:不声明——》声明特定异常——》声明通用异常
如果父类方法未抛出/声明异常,则子类的覆写方法必须捕获所有的已检查异常
9. 同一个catch子句中捕获多个异常
要求:异常处理的动作相同 && 捕获的异常类型之间彼此不存在子类关系
捕获多个异常时,异常变量隐含为final变量,不能在子句体中为e赋不同的值
10. 异常链
在catch子句中再次抛出一个异常,以改变异常类型
如果在一个方法中发生了一个已检查异常,而不允许抛出它。则可以利用包装技术,捕获该异常,并将其包装成一个运行时异常。
11. finally子句
在try语句块中的方法真正返回前,还要执行finally子句中的内容。所以,finally子句中的return值会覆盖try语句块中的return值
同时,若按照上述的代码书写方式,finally子句中抛出的IOExceprion会覆盖try语句块中的IOException
12. 带资源的try语句
要求:资源必须实现AutoCloseable接口(Closeable接口)
同时,try语句体中的原始异常会重新抛出,而close方法的异常会被“抑制”
(由系统自动捕获,并由addSuppressed方法增加到原始异常。可以调用getSuppressed方法,得到从close方法抛出的被抑制的异常列表)
13. 堆栈跟踪stack trace
stack trace:一个方法调用过程的列表,包含程序执行过程中方法调用的位置
14. 这是一种什么问题?
编译器跟踪e来自try块,假设该try块中仅有的checked Exception是SQLException实例,且,假设e在catch中未发生改变,则将外围方法声明为throws SQLException是合法的
15. 例题:
分析:
代码未抛出异常 | 1,2,5,6 |
抛出一个IOException异常 | 1,3,4,5,6——catch子句未抛出异常 1,3,5——catch子句中抛出异常给调用者 |
抛出非IOException异常 | 1,5,异常被抛回给方法的调用者 |
16. throw和throws的区别
throw:抛出java.lang.Throwable类的对象
例:throw new IllegalArgumentException(“参数错误”);
throws:声明方法可能会抛出的异常类型
Java中,任何未被处理的checked Exception强制在throws子句中声明
17.