异常

来源:互联网 发布:linux卸载subversion 编辑:程序博客网 时间:2024/04/27 22:39

异常对象都是派生于Throwable类的一个实例.但在下一层分解为两个分支:Error和Exception。Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。Exception这个层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常。


派生于RuntimeException的异常包含下面几种情况:
• 错误的类型转换。
• 数组访问越界。
• 访问空指针。
不是派生于RuntimeException的异常包括
• 试图在文件尾部后面读取数据。
• 试图打开一个错误格式的URL。

派生于RuntimeException的异常包含下面几种情况:
• 错误的类型转换。
• 数组访问越界。
• 访问空指针。
不是派生于RuntimeException的异常包括
• 试图在文件尾部后面读取数据。
• 试图打开一个错误格式的URL。

• 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。

Java语言规范将派生于Error类或RuntimeException类的所有异常称为未检查( unchecked)异常,所有其他的异常称为已检查( checked)异常。


什么异常必须使用throws子句声明
调用一个抛出已检查异常的方法,例如, FileInputStream构造器,回报FileNotFoundException.

程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常
程序出现错误,例如, a[-1]=0会抛出一个ArrayIndexOutOfBoundsException这样的未检查异常。
Java虚拟机和运行时库出现的内部异常.

如果在子类中覆盖了超类的一个方法,子类方法中声明的已检查异常不能超过超类方法中声明的异常范围。

如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么
1)程序将跳过try语句块的其余代码。
2)程序将执行catch子句中的处理器代码。
如果在try语句块中的代码没有抛出任何异常,那么程序将跳过catch子句。
如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立刻退出


不管是否有异常被捕获, fianlly子句中的代码都被执行。

异常链,抛出异常时包装一下异常

try{}catch(Exception e){

Throwable t = new xxxException(xxx);

t.initCause(e);这里的意思为是因为e导致的t。t.getCause()就是e那个异常

throw t;

}

可用得到的Throwable.getCause


使用异常机制的几点建议

1. 异常处理不能代替简单的测试。只在异常情况下使用异常机制
2. 不要过分地细化异常
3. 利用异常层次结构
4. 不要压制异常
5. 在检测错误时,“苛刻”要比放任更好
6. 不要羞于传递异常

Logger a = Logger.getLogger(xxx);
a.xxx(xxx);





0 0
原创粉丝点击