异常的概念
- JAVA异常是JAVA提供的用于处理程序中错误的一种机制,这个错误指的是运行期出现的错误(如除0溢出、数组下标越界、所要读取文件不存在等),而非执行期;观察错误的名字和行号最重要。
- JAVA程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给JAVA运行时系统,这个过程称为抛出。
- 当JAVA运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这个过程称为捕获。
- 使用try、catch语法,JVM就会尝试执行try区块中的程序代码。如果发生错误,执行流程会跳离错误发生点,然后比较catch括号中声明的类型。是否符合被抛出的错误对象类型,如果是的话,就执行catch区块中的程序代码。有catch必须有try。
异常的分类
- Throwable分两类:Error、Exception;Exception分两类:RuntimeException、其他Exception
Throwable:可抛出的,只要从它继承,就可以抛。
Error:系统的错误,由JAVA虚拟机生成并抛出,是我们无法处理的错误,如动态链接失败、虚拟机错误。
Exception:所有异常类的父类,可处理的错误。
RuntimeException:经常出的特殊错误,如被0除、数组下标超范围等,如果处理会对程序可读性和运行效率影响很大。可catch也可不catch。
其他Exception:非RuntimeException,是必须catch的错误或用throws声明这个方法会抛出异常。
异常的捕获和处理
try {
//可能抛出异常的语句
} catch (SomeException1 e)
{
...
} catch (SomeException2 e)
{
...
} finally {
...
}
try语句:
try语句指定了一段代码,该段代码就是一次捕获并处理异常的范围。
在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理。
如果没有异常产生,所有catch代码段被略过不执行。catch语句:
在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
在catch中声明的异常对象封装了异常时间发生的信息,在catch语句块中可以使用这个对象的一些方法获取这些信息。
例如:
getMessage()方法,用来得到有关异常事件的信息。
printStackTrace(0方法,用来跟踪异常事件发生时执行堆栈的内容。finally语句
finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。
无论try所指定的程序块中是否抛出异常,finally所指定的代码都要被执行。
通常finally语句中可以进行资源的清除工作。如:关闭打开的文件,删除临时文件。
import java.io.*;
public class TestEx {
public static void main(String[] args) {
FileInputStream in = null;
try {
in = new FileInputStream("myfile.txt");
int b;
b = in.read();
while (b != -1) {
System.out.print((char)b);
b = in.read();
}
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
throws
声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。
多个异常可以使用逗号隔开。throw
具体向外抛异常的动作,所以它是抛出一个异常实例。程序在执行到throw语句时立即停止,它后面的语句都不执行。
重写方法需要抛出与原方法所抛出异常类型一致的异常或不抛出异常。
throws和throw两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
使用自定义的异常
如下步骤:
1. 通过继承java.lang.Exception类声明自己的异常类。
2. 在方法适当的位置生成自定义异常的实例,并用throw语句抛出。
3. 在方法的声明部分用throws语句声明该方法可能抛出的异常。