蛋微疼的"Finally block does not complete normally"

今天用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程序必须捕获或声明所有的非运行时异常 ,但对运行时异常 可以不做处理。

 

附赠示例代码一个:


 

 

=============================================================

2.参考文章:A Tale of Bad Exception Handling in Finally Blocks in Java。

老外开篇第一段文字,写的非常实在。于是我就坚持看完了全文,也找到了这个问题的答案

 

"There is always something more to learn . That was the lesson for me last week when I learned something new about the Java programming language, despite having used professionally it for almost 10 years."

发布了240 篇原创文章 · 获赞 6 · 访问量 33万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览