要明确异常继承体系,用表格来表示,这样理解的更快
Java.lang.Throwable |
---|
java.lang.Throwable.Error | java.lang.Throwable.Exception |
---|
执行异常(RuntimeException) | 检查异常(CheckedException) |
---|
这个很好理解,就是错误的意思,一般指与虚拟机相关JVM相关(如系统崩溃、虚拟机错误、动态链接失败),这种错误无法恢复或者不可捕获,后果是导致应用程序中断。
Exception就是异常了,通常来说就是你能够捕获到的异常。
这个异常又分两大类(RuntimeException)(CheckedException)。
所有的CheckedException异常都是可以被处理(修复)的异常,所以Java程序必须显式处理。
这就是我们常见的处理异常方式
Checked处理方式有如下两种:
1当前方法明确知道如何处理该异常,程序应该使用try...catch块来捕获该异常,格式就是
try{
代码块
}
catch(异常名)
{
代码处理块(简单来说就是处理try里面的代码块或者打印异常信息)
}
finally
{
使用finally回收资源
}
catch块进行说明:在Java7中新增的catch中可以使用多异常捕获,之间用|表示.访问异常信息也有常用的方法:
getMessage():返回该异常的详细描述字符串。
printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。
printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流。
getStackTrace():返回该异常的跟踪栈信息。
finally块进行说明:显示回收,这个地方一定会执行。这里要讲一下,回收的可是物理资源,就是数据库连接、网络连接和磁盘文件等,这些资源都必须显示回收。
重点:这有经常会跟垃圾回收机制做个比较。垃圾回收机制是收堆内存中对象所占用的内存。而栈是Java自己释放掉为该变量所占用的内存空间。
2当前方法不知道如何处理这种异常,应该在定义该方法时声明抛出异常。
Runtime处理方式就比较灵活了,无序显示抛出异常,如果要捕获异常,也可以使用try...catch块来实现。
throws声明抛出异常,如果该异常不知道如何处理,那就向上级抛出,如果到了main这一级也不知道如何抛出的话,也可以用throws声明。main申请之后,只会把该异常抛给VM来处理,JVM处理方法就是,打印异常栈信息,并终止程序运行,这个时候的结果就是异常自动结束。总结一下方法用throws进行声明,跟catch类是,可以抛出多个异常多个异常可以用。
如果你程序有业务要求,你当然也可以自已抛出异常,我们往往通过throw来抛出异常。