错误会被包装成对象,这些对象是<b>可抛出</b>的,和异常相关的方法都是从java.lang.Throwable
类继承过来的。
1. 异常继承架构
Throwable 类可以取得错误信息、堆栈追踪(Stack Trace)等。
它的两大子类:
- java.lang.Error
- java.lang.Exception
Error 类及其子类实例为严重系统错误,称为<b>非受检异常(Unchecked Exception)</b>比如:
- 硬件层面错误
- JVM 错误
- 内存不足
如果抛出了 Throwable 对象,而程序中无 catch 捕捉到错误对象,最后由 JVM 捕捉到的话,JVM 基本处理是显示错误对象打包的信息并中断程序。
Exception 或其子对象但非属于 RuntimeException 或其子对象,称为<b>受检异常(Checked Exception)</b>。
受检异常就是受编译程序检查的异常。就语法与继承架构上来说,受检异常必须明确使用 try、catch
处理或 throws
声明这个方法会抛出异常,否则,编译失败。
若父类异常对象在子类异常对象前被捕捉,则 catch
子类异常对象的区块永远不会被执行,编译失败。
2. 多重捕捉(Multi-catch)
try{
doSomething()
}catch( IOException | InterruptedException | ClassCastException e ){
e.printStackTrace();
}
catch
括号中列出的异常不得有继承关系,否则编译失败。
3. 是 “抛” 还是 “抓”?
<b>“抛”(throws)</b>: 一般用于当时的环境无法决定如何处理的部分,可抛出由调用方法的客户端处理。
<b>“抓”(try-catch)</b>: 用于当时环境可以处理的异常。
4. 异常对象的自动收集
堆栈追踪:显示了异常类型、最顶层是异常根源、依次是调用方法的顺序。
最简单的是直接调用异常对象的 printStackTrace()
方法。 printStackTrace()
还接受 PrintStream
、PrintWriter
版本,可将堆栈追踪信息以指定方式输出至目的地。
getStackTrace()
:返回 StackTraceElement
数组,获取个别的堆栈追踪元素进行处理,其中索引 <b>0</b> 为异常根源相关信息。
StackTraceElement
有 getClassName()
、 getFileName()
、getLineNumber()
、getMethodName()
这些方法。
在使用 throw 重抛异常时,异常的堆栈追踪起点仍是异常的发生根源,而不是重抛异常的地方。如果使用
fillInStackTrace()
会重新装填异常堆栈,将起点设为重抛异常的地方,并返回 Throwable 对象。