Java笔记之异常机制

来源:互联网 发布:techrules 知乎 编辑:程序博客网 时间:2024/06/05 09:16

1.处理异常

处理异常的时候,应该保证两点:返回到一种安全状态,并能让用户执行一些其他的命令;允许用户保存所有的操作结果,并以适当的方式终止程序。

以下问题需要特别关注:用户输入错误、设备错误、物理限制、代码错误等。


1.1异常分类

异常的层次结构如下图:


Error类描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象,如果出了这样的内部错误,再也无能为力了。

在处理异常的时候,需要关注Exception层次结构。该层次分为两支:一支派生于RuntimeException,另一支包含其他异常。由程序错误导致的属于RuntimeException,而程序本身没有问题,但由于I/O错误这类问题导致的属于其他异常。

RuntimeException包含:

1)错误的类型转换

2)数组访问越界

3)访问空指针

RuntimeException不包含:

1)试图在文件尾部后面读取数据

2)视图打开错误格式的URL

3)试图根据给定字符串查找Class,但这个字符串不存在

如果出现RuntimeException异常,那就一定是你的问题。


1.2声明已检查的异常

如果遇到异常,方法需要在头部声明所有可能抛出的异常,格式如下:

public FileInputStream(String name) throws FileNotFoundException
必须使用throws的情况:

1)调用一个抛出已检查异常的方法

2)程序中使用throw抛出一个异常

3)程序出现错误

4)Java虚拟机内部异常


1.3如何抛出异常

throw new EOFException;或者EOFException e=new EOFException();throw e;


1.4创建异常类

在程序中可能会遇到标准异常类没有充分描述清楚的问题,需要创建自己的异常类。例如:

class FileFormatException extends IOException{public FileFormatException()...}


2.捕获异常

有些代码的异常不需理睬,有些必须要捕获。如果某个异常发生时没有被捕获,就会终止执行。要捕获异常需要采用try/catch语句块。

try{...}catch(ExceptionType e){...}
如果在try语句块中抛出了一个在catch中说明的异常类,那么

1)程序将跳过try语句块的其余代码

2)程序执行catch语句中的代码。

如果没有抛出异常,那么就会跳过catch语句块。



2.1捕获多个异常

可以按照下列方式捕获多个异常类型,对不同的类型进行处理。

try{...}catch(MalformedURLException e1){...}catch(UnknowHostException e2){...}catch(IOException e3){...}

2.2Finally子句

try{...}catch(ExceptionType e){...}finally{...//用于资源回收}
有三种情况下会执行finally语句:

1)代码没有抛出异常

2)代码抛出异常并在catch中捕获

3)代码抛出异常但是没有在catch中被捕获


3.使用异常机制的建议

3.1异常处理不能代替简单的测试

3.2不要过分的细化异常

3.3利用异常层次结构,将一种异常转换为另一种更加适合的异常

3.4不要压制异常


原创粉丝点击