老程序员也搞不定的 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 在操作数栈中存储数值 1istore_0 将操作数栈中的数据存储在局部变量的位置 0iload_0 从局部变量读取值到操作数栈istore_1 将操作数栈中存储 1 存储在局部变量的位置 1iinc 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 中法友谊蕴山水 7904430
- 2 你以为的进口尖货 其实早已国产了 7809314
- 3 劲酒如何成了年轻女性的神仙水 7712320
- 4 盘点2025大国重器新突破 7619112
- 5 美国称将调整与中国经济关系 7522106
- 6 大雪吃三宝是指哪三宝 7424266
- 7 美军承认:击落美军战机 7327701
- 8 尖叫之夜直播 7238594
- 9 老干妈不需要创新 7140225
- 10 周末去哪玩?雪场“不打烊” 7042266




![一坨是于雯:今天扎了小麻花辫er[佐伊卖萌] ](https://imgs.knowsafe.com:8087/img/aideep/2021/7/18/d89d08b025bb03ef00fa84429ccc0d54.jpg?w=250)





CSDN
