在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的“掌控”它,却并不是一件容易的事。别的不说,咱就拿 fianlly 来说吧,别看它的功能单一,但使用起来却“暗藏杀机”,若您不信,咱来看下面的这几个例子...
坑1:finally中使用return
若在 finally 中使用 return,那么即使 try-catch 中有 return 操作,也不会立马返回结果,而是再执行完 finally 中的语句再返回。此时问题就产生了:如果 finally 中存在 return 语句,则会直接返回 finally 中的结果,从而无情的丢弃了 try 中的返回值。
① 反例代码
public static void main(String[] args) throws FileNotFoundException { System.out.println("执行结果:" + test()); } private static int test() { int num = 0; try { // num=1,此处不返回 num++; return num; } catch (Exception e) { // do something } finally { // num=2,返回此值 num++; return num; } }
以上代码的执行结果如下:
② 原因分析
如果在 finally 中存在 return 语句,那么 try-catch 中的 return 值都会被覆盖,如果程序员在写代码的时候没有发现这个问题,那么就会导致程序的执行结果出错。
③ 解决方案
如果 try-catch-finally 中存在 return 返回值的情况,一定要确保 return 语句只在方法的尾部出现一次。
④ 正例代码
public static void main(String[] args) throws FileNotFoundException { System.out.println("执行结果:" + testAmend()); } private static int testAmend() { int num = 0; try { num = 1; } catch (Exception e) { // do something } finally { // do something } // 确保 return 语句只在此处出现一次 return num; }