异常种类
Throwable
Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类或其子类之一的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出,才可以是 catch 子句中的参数类型。
Throwable 类及其子类有两个构造方法,一个不带参数,另一个带有 String 参数,此参数可用于生成详细消息。
Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。
Java将可抛出(Throwable)的结构分为三种类型:
- 错误(Error)
- 运行时异常(RuntimeException) :是 runtime 阶段碰到的异常. 在编译的时候不需要检查
- 被检查的异常(Checked Exception):在编译阶段的异常,并且强制检查
编译器强制 checked 异常必须try..catch处理或用throws声明继续抛给上层调用方法处理, 这就是为什么叫checked异常, 而 Runtime 异常可以处理也可以不处理, 所以, 编译器不强制用try..catch处理或用throws声明, 所以 Runtime 异常也称为unchecked异常
Error
Error 是 Throwable 的子类,用于指示应用程序本身无法克服和恢复的一种严重问题,不应该试图捕获。
和RuntimeException一样, 编译器也不会检查Error。
内存溢出和线程死锁等系统问题就是错误,程序本身无法修复这些错误的。
Exception
表示程序还能够克服和恢复的问题, 比如一个输入参数不对引起的异常.
一般对于可以恢复的条件使用被检查异常(Exception的子类中除了RuntimeException之外的其它子类),对于程序错误使用运行时异常。
几个 常见的异常:
ClassNotFoundException
当应用程序试图使用以下方法通过字符串名加载类时: Class 类中的 forName 方法。 ClassLoader 类中的 findSystemClass 方法。 ClassLoader 类中的 loadClass 方法。 但是没有找到具有指定名称的类的定义,抛出该异常。ClassCastException
父类引用指向的对象的类型不是子类的时候。ILLegalArgumentException
向方法传递了一个不合法或不正确的参数。IndexOutOfBoundsException
指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。NullPointerException
当应用程序试图在需要对象的地方使用 null 时,抛出该异常
处理异常
- try catch.
自己在catch块中处理异常. - throws.
把异常抛给调用这个方法的模块去处理. 一般 Java 的库就是怎么处理的.
try-catch-finally
每一个try后面至少要有一个catch或者finally
finally放在catch后面(如果有的话),是一定会执行的块,无论是否有异常发生。
执行顺序如下:
- 如果try中没有异常且try中有return (执行顺序)
try ---- finally --- return
- 如果try中有异常并且try中有return
try----catch---finally--- return
- try中有异常,try-catch-finally里都没有return ,finally 之后有个return
try----catch---finally
try中有异常以后,根据java的异常机制先执行catch后执行finally,此时错误异常已经抛出,程序因异常而终止,所以你的return是不会执行的
当 try和finally中都有return时,finally中的return会覆盖掉其它位置的return(多个return会报unreachable code,编译不会通过)。
当finally中不存在return,而catch中存在return,但finally中要修改catch中return 的变量值时
int ret = 0;
try{
throw new Exception();
}
catch(Exception e)
{
ret = 1; return ret;
}
finally{
ret = 2;
}
最后返回值是1,因为return的值在执行finally之前已经确定下来了
总结:如果try或者catch中有return的话,先是finally执行然后才是return执行,但是return返回值无法被finally中的语句更改。