Throwable:有两个重要的子类:Exception和Error ,它们各又包含大量的子类
Error(错误):是程序无法处理的错误,表示运行应用程序中较为严重的问题,代码运行时出的问题。
如:OutOfMemoryError,StackOverFlowError ,它们是Virtual MachineError。还有类定义错误NoClassDefFoundError等。这些错误不可查。
Exception(异常):重要子类:RuntimeException类 和 IOException
异常和错误的区别:异常可被程序本身处理,错误是无法处理的
Java的异常又可分为可查异常和不可查异常。
可查异常:编译器要求必须强制处理的异常
不可查异常:编译器不要求强制处理的异常,包括运行时异常和错误
运行时异常:都是RunTimeException类以及子类的异常,这些异常是不检查异常,可以捕获也可以不捕获
非运行时异常(编译异常):使RunTimeException意外的异常,在编译时必须处理的异常,类型上都属于Exception类以及子类
(java中的异常为Throwable,异常为Exception,这是区分可查/不可察 和 运行/非运行的依据)
异常处理机制:抛出异常,捕捉异常
抛出异常:从方法中抛出的异常用throws 。throw一般出现在catch语句块中
捕捉异常:try…catch 或者 try-catch-finally语句实现
一个方法所能抛出的异常,一定是java代码在某处所抛出的异常,简单来说,异常总是先被抛出,后背捕捉。
一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再又匹配和捕获异常类型的机会,所以catch子句捕获的异常一定是从小到大,如果第一个就是Exception,那么后面的catch子句就没有机会被执行。
finally子句是一定会被执行的,无论是否捕获或处理异常。再try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。以下四种特使情况可以不被执行:
1 再finally语句块中发生了异常。
2 再前面的代码中用了System.exit()退出程序
3 程序所在的线程死亡
4 关闭CPU