异常处理

错误会被包装成对象,这些对象是可抛出的,和异常相关的方法都是从java.lang.Throwable类继承过来的。

1. 异常继承架构

异常处理_第1张图片
异常继承架构

Throwable 类可以取得错误信息、堆栈追踪(Stack Trace)等。
它的两大子类:

  • java.lang.Error
  • java.lang.Exception

Error 类及其子类实例为严重系统错误,称为非受检异常(Unchecked Exception)比如:

  • 硬件层面错误
  • JVM 错误
  • 内存不足

如果抛出了 Throwable 对象,而程序中无 catch 捕捉到错误对象,最后由 JVM 捕捉到的话,JVM 基本处理是显示错误对象打包的信息并中断程序。

Exception 或其子对象但非属于 RuntimeException 或其子对象,称为受检异常(Checked Exception)
受检异常就是受编译程序检查的异常。就语法与继承架构上来说,受检异常必须明确使用 try、catch 处理或 throws 声明这个方法会抛出异常,否则,编译失败。

若父类异常对象在子类异常对象前被捕捉,则 catch 子类异常对象的区块永远不会被执行,编译失败。

2. 多重捕捉(Multi-catch)

try{
  doSomething()
}catch( IOException | InterruptedException | ClassCastException e ){
  e.printStackTrace();
}

catch 括号中列出的异常不得有继承关系,否则编译失败。

3. 是 “抛” 还是 “抓”?

“抛”(throws): 一般用于当时的环境无法决定如何处理的部分,可抛出由调用方法的客户端处理。
“抓”(try-catch): 用于当时环境可以处理的异常。

4. 异常对象的自动收集

堆栈追踪:显示了异常类型、最顶层是异常根源、依次是调用方法的顺序。
最简单的是直接调用异常对象的 printStackTrace() 方法。 printStackTrace() 还接受 PrintStreamPrintWriter 版本,可将堆栈追踪信息以指定方式输出至目的地。

getStackTrace():返回 StackTraceElement 数组,获取个别的堆栈追踪元素进行处理,其中索引 0 为异常根源相关信息。

StackTraceElementgetClassName()getFileName()getLineNumber()getMethodName()这些方法。

在使用 throw 重抛异常时,异常的堆栈追踪起点仍是异常的发生根源,而不是重抛异常的地方。如果使用 fillInStackTrace() 会重新装填异常堆栈,将起点设为重抛异常的地方,并返回 Throwable 对象。

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