“finally block does not complete normally”的警告

转自:http://sw1982.iteye.com/blog/773331


今天用try-finally的时候,整出一个“finally block does not complete normally”的警告。想了半天也没明白什么一个情况。

 可以看下面的代码, return 写在finally块就会得到警告!解决方案: return放到finally外面。


但是,java里面不是可以保证finally一定会执行的么,为什么不可以在finally块做return???

 

细细看道来:

 

debug一下这个函数,就会惊讶的发现, 里面抛出的异常会被finally吃掉。 这也就是为什么会被警告的原因。

	 @SuppressWarnings("finally")
	 private boolean isReturnWithinFinally() {
	 try {
	 if (true) throw new RuntimeException();
	 } finally {
	 return true; // This hides the exception
	 }
	 }

那么,下面这样会不会ok呢?先把异常处理

	public static void main(String[] args) {
		try{
			throw new RuntimeException();
		}catch(Exception e) {
			//
		}
		finally {
			return;
		}
	}

结论是:依旧不行。java里面的异常分为可不获和不可捕获两类,即便使用到catch块,也会导致非捕获的错误被finally吃掉。

 

因此,return一定要放到finally外面。

 

===1.java异常简介

类Throwable有两个直接子类:Error和Exception。Error类对象(如动态连接错误等),由Java虚拟 机生成并抛弃(通常,Java程序不对这类 异常进行处理) ;Exception类对象是Java程序处理或抛弃的对象。它有各种不同的子类分别对应于不同类型的例外。其中类RuntimeException代表运行时由Java虚拟机生成的 异常,如算术运算异常ArithmeticException(由除 0错等导致)、数组越界例外ArrayIndexOutOfBoundsException等;其它则为非运行时异常,如输入输出例外 IOException等。Java编译器要求 Java程序必须捕获或声明所有的非运行时异常 ,但对运行时异常 可以不做处理。

 

附赠示例代码一个:






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值