Java异常处理
- 程序中对函数调用失败的表示:
c语言中使用常使用函数返回值来表示,返回0表示调用成功,返回非0值表示调用失败
java中使用异常机制,异常为一个类类型,其中包含了异常的类型信息。 - Java中的异常分为两类:
Error:严重错误,程序无法处理,如:OutOfMemoryError(内存耗尽)
Exception:运行时错误,可以由程序捕获并处理,如SocketException(网络读取失败)。而Exception又分为两类:
RuntimeException
非RuntimeException,如IOException - Java中必须捕获的异常:Exception及其子类,但不包括RuntimeException及其子类。
必须捕获的意思是,如果不加try-catch,则程序编译不通过。
例如:
import java.io.*;
public class IOExceptionPractice {
public static void main(String[] args) {
try {
//可能抛出FileNotFoundException
FileReader fileReader = new FileReader("test.txt");
BufferedReader bufferReader = new BufferedReader(fileReader);
//可能抛出IOException
String line = bufferReader.readLine();
System.out.println(line);
} catch (FileNotFoundException e1) {
System.out.println(e1);
} catch (IOException e2) {
System.out.println(e2);
}
}
}
代码中创建FileReader对象时,可能会抛出FileNotFoundException异常,在readline()函数可能会抛出IOException异常。这两种异常都是必须捕获的异常,如果不加try-catch,对导致程序编译不通过。
-
在对多个异常进行捕获时,可以使用多个catch,如上述程序中,使用了两个catch。需要注意的是,在使用多个catch时,子类异常必须要放在父类异常的前面,例如:上述代码中FileNotFoundException异常时IOException异常的子类,如果先对IOException放在上面,那么编译会报错,因为FileNotFoundException也会被视为IOException异常捕获。如下图所示。
可以看出,编译器提示FileNotFoundException异常已经被捕获了。 -
对于那些不论异常是否发生,我们都希望执行的代码,可以放在finally字句里面。
finally字句不是必须的,如果出现,就是最后执行的。