异常那点事

[size=small]一、概述
在Java程序设计语言中,异常对象都是派生自java.lang.Throwable类的一个实例!所有派生于Error类或RuntimeException类的异常称为未检查(unchecked)异常,所有其他的异常称为已检查(checked)异常。
异常处理的方法有二种:1. 声明异常 2. 捕获异常

Throwable
|
---------------
| |
Error Exception
|
---------------
| |
Check Runtime
Exception Exception

二、声明异常
关键字: throws, throw
1. 已检查异常必须声明,未检查异常可声明也可不声明。
2. 如果在子类中覆盖了超类的一个方法,子类方法中声明的已检查异常(未检查异常可以不再声明)不能超过超类方法中声明的异常范围(也就是说,子类方法中抛出的异常范围更小,或者根本不抛出任何异常(此时为捕获了超类抛出的所有已检查异常))。
3. 如果超类方法中没有抛出任何已检查异常,子类也不能抛出任何已检查异常。
4. Java 编译器严格的执行throws说明符。如果调用了一个抛出已检查异常的方法,就必须对它进行处理,或者将它传递出去。

三、捕获异常
关键字:try, catch, finally

四、总结
[list]
[*]异常有两种形式:检验异常和非检验异常;
[*]检验异常包括Exception的所有子类型,但不包括扩展RuntimeException的类;
[*]检验异常遵守处理或声明它的规则,任何可能抛出检验异常的方法(包括调用能够抛出检验异常方法的方法),都必须使用throws关键字声明异常,或者用适当的try/catch处理异常;
[*]Error或RuntimeException的子类型是非检验异常,因此,编译器不强迫要求处理或声明规则。你可以随意声明或处理它们,编译器对此并不关心;
[*]如果使用可选的finally块,则始终会调用它,不管在相应的try内是否有异常抛出,也不管抛出的异常是否被捕获;
[*]“始终调用finally”这一规则的唯一例外是:如果JVM关闭,则不会调用finally块。如果从try或catch块调用System.exit(),则会发生这种情况;
[*]调用finally并不意味着它必然完成。finally块内的代码本身能够引发异常或者触发方法System.exit();
[*]未捕获的异常通过调用栈向后传播,它从抛出该异常的方法开始,到具有该异常类型相应catch的第一个方法为止,或者到JVM关闭为止[如果该异常到达main(),并且main()声明它“躲避”该异常时,则JVM会关闭];
[*]可以创建自己的异常,通常通过扩展Exception或其子类型之一创建。这些异常将被看作检验异常,编译器将对这些异常强制执行处理或声明规则;
[*]所有的catch块都必须按照从最具体到最通用的顺序排列。如果对于IOException和Exception有一个catch子句,则必须把针对IOException的catch放在代码的前面。否则,IOException将被catch(Exception e)捕获,因为catch参数能够捕获这一特定的异常或其任何子类型!编译器将禁止定义从来不能到达的catch子句;
[*]有些异常是由程序员创建的,有些则是由JVM创建的。
[/list][/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值