老程序员也搞不定的 4 个巨坑!


finally 中使用 return
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;}}
原因分析
解决方案
正例代码
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;}

finally中的代码“不执行”
反例代码
public static void main(String[] args) throws FileNotFoundException {System.out.println("执行结果:" + getValue());}private static int getValue() {int num = 1;try {return num;} finally {num++;}}

原因分析
// class version 52.0 (52)// access flags 0x21public class com/example/basic/FinallyExample {// compiled from: FinallyExample.java// access flags 0x1public <init>()VL0LINENUMBER 5 L0ALOAD 0INVOKESPECIAL java/lang/Object.<init> ()VRETURNL1LOCALVARIABLE this Lcom/example/basic/FinallyExample; L0 L1 0MAXSTACK = 1MAXLOCALS = 1// access flags 0x9public static main([Ljava/lang/String;)V throws java/io/FileNotFoundExceptionL0LINENUMBER 13 L0GETSTATIC java/lang/System.out : Ljava/io/PrintStream;NEW java/lang/StringBuilderDUPINVOKESPECIAL java/lang/StringBuilder.<init> ()VLDC "\u6267\u884c\u7ed3\u679c:"INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;INVOKESTATIC com/example/basic/FinallyExample.getValue ()IINVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)VL1LINENUMBER 14 L1RETURNL2LOCALVARIABLE args [Ljava/lang/String; L0 L2 0MAXSTACK = 3MAXLOCALS = 1// access flags 0xAprivate static getValue()ITRYCATCHBLOCK L0 L1 L2 nullL3LINENUMBER 18 L3ICONST_1ISTORE 0L0LINENUMBER 20 L0ILOAD 0ISTORE 1L1LINENUMBER 22 L1IINC 0 1L4LINENUMBER 20 L4ILOAD 1IRETURNL2LINENUMBER 22 L2FRAME FULL [I] [java/lang/Throwable]ASTORE 2IINC 0 1L5LINENUMBER 23 L5ALOAD 2ATHROWL6LOCALVARIABLE num I L0 L6 0MAXSTACK = 1MAXLOCALS = 3}

??iconst_1???在操作数栈中存储数值?1??istore_0???将操作数栈中的数据存储在局部变量的位置?0??iload_0????从局部变量读取值到操作数栈??istore_1???将操作数栈中存储?1?存储在局部变量的位置?1??iinc?0?by?1?把局部变量位置?0?的元素进行递增(+1)操作??iload_1?将局部位置?1?的值加载到操作数栈中??ireturn?返回操作数栈中的?int?值



解决方案
正例代码
private static int getValueByAmend() {int num = 1;try {// do something} catch (Exception e) {// do something} finally {num++;}return num;}

finally 中的代码“非最后”执行
反例代码
public static void main(String[] args) throws FileNotFoundException {execErr();}private static void execErr() {try {throw new RuntimeException();} catch (RuntimeException e) {e.printStackTrace();} finally {System.out.println("执行 finally.");}}

原因分析

public static void main(String[] args) {System.out.println("我是标准输出流");System.err.println("我是标准错误输出流");}


public static void main(String[] args) throws FileNotFoundException {// 将标准输出流的信息定位到 log.txt 中System.setOut(new PrintStream(new FileOutputStream("log.txt")));System.out.println("我是标准输出流");System.err.println("我是标准错误输出流");}


解决方案
正例代码
private static void execErr() {try {throw new RuntimeException();} catch (RuntimeException e) {System.out.println(e);} finally {System.out.println("执行 finally.");}}

finally中的代码“不执行”
在 try-catch 语句中执行了 System.exit; 在 try-catch 语句中出现了死循环; 在 finally 执行之前掉电或者 JVM 崩溃了。
反例代码
public static void main(String[] args) {noFinally();}private static void noFinally() {try {System.out.println("我是 try~");System.exit(0);} catch (Exception e) {// do something} finally {System.out.println("我是 fially~");}}

解决方案

总结

程序员如何避免陷入“内卷”、选择什么技术最有前景,中国开发者现状与技术趋势究竟是什么样?快来参与「2020?中国开发者大调查」,更有丰富奖品送不停!

?支付宝 “集五福”今日开启;小米起诉美国国防部;Chrome 再次屏蔽七个端口 | 极客头条
?因为在企业软件中采用了React,我差点被公司开除
?和 Apple “较上劲”了?Google 解决 Cookie 隐私问题上拒绝“一刀切”
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 习近平将发表二〇二六年新年贺词 7904141
- 2 2026年国补政策来了 7808738
- 3 东部战区:开火!开火!全部命中! 7712893
- 4 2026年这些民生政策将惠及百姓 7616985
- 5 小学食堂米线过期2.5小时被罚5万 7519709
- 6 解放军喊话驱离台军 原声曝光 7428214
- 7 为博流量直播踩烈士陵墓?绝不姑息 7327605
- 8 每月最高800元!多地发放养老消费券 7238391
- 9 数字人民币升级 1月1日起将计付利息 7141831
- 10 2026年1月1日起 一批新规将施行 7040675











CSDN
