Java:异常处理

(PPT来源:廖雪峰老师网课)

异常

Java 将异常当作对象来处理,并定义一个基类 java.lang.Throwable 作为所有异常的超类。

  • 异常分为两大类:
    Error —— 发生了严重的错误,程序不能进行调整的
    Exception —— 运行时出现的逻辑错误,需要捕获并处理
    体系结构如下,其中红色为必须捕获的异常——CheckedException
    Java:异常处理_第1张图片
  1. 异常可以在任何地方抛出
  2. 异常是class,本身带有类型信息
  3. 异常只需要在上层捕获,和方法调用分离

异常的体系

申明异常

利用 try{…} catch( ) {…} finally{…} 捕获异常:

  1. 可以使用多个catch语句,每个catch对应捕获,从上到下匹配,所以子类异常应写在前面,否则会被父类捕获
  2. finally语句 可有可无;总是最后执行;有无错误时都执行
  3. 如果几种异常不存在继承关系,可以在 catch 中用 | 一次编写多个

对可能抛出CheckedException的方法调用:
4. 捕获Exception并处理
5. 不捕获但通过throws申明(即放在上层去捕获)
6. main() 是最后捕获Exception的机会(仍未捕获,JVM就会报错退出)

  • eg:
  • 1
    Java:异常处理_第2张图片
    此时捕获异常,try后续的“ok”不再执行
  • 2
    没有进行异常捕获,编译器会提示编译错误,并给出处理方式(向上抛出异常)
    Java:异常处理_第3张图片
    可以在上层捕获或继续向上抛出异常
    Java:异常处理_第4张图片

直至 main() 方法,如果还没有捕获,虚拟机就会关掉程序,打印出出错信息

  • 小结
    Java:异常处理_第5张图片

异常的传播

printStackTrace( ) 可以打印出方法的调用栈,对于调试错误很有用。可以跟踪找出异常是从哪个代码抛出的

Java:异常处理_第6张图片

异常的转换

如果一个方法捕获了某个异常后,又在 catch 子句中抛出新的异常,就“转换”了异常,会导致原始异常丢失;
可以在新抛出的异常中添加原始的异常信息 e 来解决:

Java:异常处理_第7张图片 Java:异常处理_第8张图片

catch 如果将要抛出异常,则会先执行 finally 语句:

  1. finally 中正常打印完成,再返回 catch 异常
  2. 此时若 finally 语句中有异常,则会捕获 finall 中的异常,而使得原 catch 中的异常被屏蔽(Java只能传播一个异常,后抛出没有被 catch 的会被前面的覆盖屏蔽掉)

保存所有异常

  1. 用origin 变量保存原始异常
  2. 如果存在原始异常,用 addSuppressed() 添加新异常
  3. 如果存在原始异常 或 新异常,最后在 finally 之后抛出
Java:异常处理_第9张图片
  1. for 循环遍历,getSuppressed() 获取所有异常信息
Java:异常处理_第10张图片
  • 小结
    Java:异常处理_第11张图片
    Java:异常处理_第12张图片

后续为Logging日志内容

你可能感兴趣的:(Java:异常处理)