谈一谈Java中的Error和Exception

Error和Exception的联系

  • 继承结构:Error和Exception都是继承于Throwable,RuntimeException继承自Exception。

  • Error和RuntimeException及其子类称为未检查异常(Unchecked exception),其它异常成为受检查异常(Checked Exception)。

Error和Exception的区别

  • Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。

  • Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

运行时异常和受检查的异常

Exception又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception )。

  • RuntimeException:其特点是Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try……catch捕获,也没有用throws抛出,还是会编译通过,如除数为零的ArithmeticException、错误的类型转换、数组越界访问和试图访问空指针等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。

  • 受检查的异常(IOException等):这类异常如果没有try……catch也没有throws抛出,编译是通不过的。这类异常一般是外部错误,例如文件找不到、试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

throw 和 throws两个关键字有什么不同

  • throw 是用来抛出任意异常的,你可以抛出任意 Throwable,包括自定义的异常类对象;throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。如果方法抛出了异常,那么调用这个方法的时候就需要处理这个异常。

try-catch-finally-return执行顺序

  • 1、不管是否有异常产生,finally块中代码都会执行;
  • 2、当try和catch中有return语句时,finally块仍然会执行;
  • 3、finally是在return后面的表达式运算后执行的,所以函数返回值是在finally执行前确定的。无论finally中的代码怎么样,返回的值都不会改变,仍然是之前return语句中保存的值;
  • 4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

举例:

情况1:try{} catch(){}finally{} return; 
按正常顺序执行。


情况2:try{ return; }catch(){} finally{} return; 
程序执行try块中return之前(包括return语句中的表达式运算)代码; 
再执行finally块,最后执行try中return; 
finally块后面的return语句不再执行。


情况3:try{ } catch(){return;} finally{} return; 
程序先执行try,如果遇到异常执行catch块, 
有异常: 
则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码, 
最后执行catch块中return. finally块后面的return语句不再执行。 
无异常: 
执行完try再finally再执行最后的return语句.


情况4:try{ return; }catch(){} finally{return;} 
程序执行try块中return之前(包括return语句中的表达式运算)代码; 
再执行finally块,因为finally块中有return所以提前退出。


情况5:try{} catch(){return;}finally{return;} 
程序执行catch块中return之前(包括return语句中的表达式运算)代码; 
再执行finally块,因为finally块中有return所以提前退出。


情况6:try{ return;}catch(){return;} finally{return;} 
程序执行try块中return之前(包括return语句中的表达式运算)代码; 
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码; 
则再执行finally块,因为finally块中有return所以提前退出。 
无异常:则再执行finally块,因为finally块中有return所以提前退出。

测试程序事例

public class FinallyTest  
{
    public static void main(String[] args) {
        System.out.println(new FinallyTest().test());;
    }
    static int test()
    {
        int x = 1;
        try
        {
            x++;
            return x;
        }
        finally
        {
            ++x;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

打印结果是2。

根据之前的分析,在try语句块中,在执行return语句时,要返回的结果已经准备好了,然后程序转到finally执行。在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,再从中取出返回结果,因此,即使finally中对变量x进行了改变,也不会影响返回结果。

参考文章:http://blog.csdn.net/kavensu/article/details/8067850

版权声明:本文为【viclee】原创,如需转载请注明出处~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值