当程序发生异常时,我们期望:返回到一种安全状态,并能够让用户执行一些其他的命令;或者 允许用户保存所有操作的结果,并以适当的方式终止程序。
异常处理机制:程序的执行过程中如果出现异常,会自动生成一个异常类对象,该异常对象将被提交给java运行时系统,这个过程成为抛出(throw)异常。当Java运行时系统接收到异常对象时会寻找处理这一异常的代码,并把当前异常对象交给它处理,这一过程称为捕获(catch)异常。如果java运行时系统未能找到可以捕获异常的方法,则运行时系统将会终止,相应的程序也将退出。
所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Exception。
Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。
Exception层次结构。这个层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常。
派生于RuntimeException的异常包含下面几种情况:
• 错误的类型转换。
• 数组访问越界。
• 访问空指针。
不是派生于RuntimeException的异常包括
• 试图在文件尾部后面读取数据。
• 试图打开一个错误格式的URL。
• 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。
“如果出现RuntimeException异常,那么就一定是你的问题”
细节:
1、如果try中语句正确,将不会执行catch中的语句;如果try语句中发生异常,try中该语句后的语句将不会继续执行,而是立即返回一个异常对象与catch中的异常对象进行匹配,如果匹配成功,将从catch后面就继续执行(也就是说try中后面的语句不会被执行了);
2、可以写多个catch语句,注意他们的先后顺序,子类必须在父类之前,否则父类型一定先于子类型被匹配,所有子类型就没有机会执行了。JAVA编译出错。
3、finally语句块是必须被执行的(因为finally子句的这个特性,所以一般将释放资源,关闭连接的语句写在里面)。
4、如果try{}中有个return语句,那么finally中的代码是否被执行呢?答案是执行的,而且在return前执行。
int f(int n)
{
try{
return n*n;//由于先执行finally语句且函数被返回,此语句将不被执行了,如果finally中没有return语句,将在执行finally后执行它。
}catch(Exception e){
} finally {
System.out.println("return who");
return n;
}
}