当程序发生异常时,我们期望:返回到一种安全状态,并能够让用户执行一些其他的命令;或者 允许用户保存所有操作的结果,并以适当的方式终止程序。

异常处理机制:程序的执行过程中如果出现异常,会自动生成一个异常类对象,该异常对象将被提交给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编译出错。

3finally语句块是必须被执行的(因为finally子句的这个特性,所以一般将释放资源,关闭连接的语句写在里面)。

4、如果try{}中有个return语句,那么finally中的代码是否被执行呢?答案是执行的,而且在return前执行。

int f(int n)
{
    try{
        System.out.println("n = "+n);//下一条是return语句,所以从这里跳入finally语句,执行完finally语句后再执行下面的return语句
        return n*n;//由于先执行finally语句且函数被返回,此语句将不被执行了,如果finally中没有return语句,将在执行finally后执行它。
    }catch(Exception e){

    } finally {
        System.out.println("do this?");
        return n;
    }
}

 

 

 

 

 posted on 2014-08-23 20:21  平和之心  阅读(341)  评论(0编辑  收藏  举报