捕获异常
我们眼中的关于异常的基本结构:
try {
//
} catch (Exception e) {
//
} finally {
//
}
try语句块内是监视区域,catch语句块内是异常发生时的异常处理程序,finally内子句无论如何都会执行,就算在try或catch中return也是一样,这里我们一般会清理一些内存之外的资源,例如数据库连接、打开的文件等。
异常说明
一个方法可能抛出的异常在方法名处声明,这样可以方便处理,关键字:throws。
例:
void f() throws FileNotFoundException{}
当一个方法中产生了异常时要么处理要么在方法处说明。有趣的是我们可以说明异常,而实际上不产生异常,以后我们就可以在方法处抛出异常而不用再说明。
自定义异常
Java中并不会将所有的异常定义,这个时候就需要一些我们自定义的异常。
例:
class MyException extends Exception{
public MyException(){}
public MyException(String msg){//我们可以将信息传递给异常类
super(msg);
}
}
构造器与异常
当有异常发生时,我们必须考虑是否一些必要的清理工作已经进行,一般情况下finally可以直接处理,但假如我们只是在构造器中打开文件,那么肯定不会在构造器中执行清理,我们需要在使用完毕后执行清理。但有一种情况,我们已经打开文件,但是发生了其他异常,那么文件资源会被正确的关闭吗?不会。
我们可以这样做:
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("filename"));
}catch(FileNotFoundException e){
//出现未找到文件异常不必关闭文件
}
catch (Exception e) {//其他异常还是需要关闭文件
try {
in.close();
} catch (IOException e1) {
}
} finally {
//不执行关闭功能
}
若我们需要在构造器中读取文件并关闭,则这样:
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("filename"));
try {
//读取
} catch (Exception e) {
//若读取时有异常则进行处理
}finally{
in.close();
}
}
catch (Exception e) {
//打开文件异常
}
处理基本规则:在创建需要清理的对象之后,立即进入一个try-finally语句块。
处理被检查异常
被检查的异常:在编译时被强制检查的异常,必须抛出或者处理。如FileNotFoundException.
不受检查的异常:RunTimeException,被自动捕获。主要是一些编程错误。
处理被检查的异常我们一般有两种方式:
1、重新抛出一个RuntimeException。
2、直接在方法处说明异常