try-catch-finally中的4个巨坑,老程序员也搞不定!(2)

简介: try-catch-finally中的4个巨坑,老程序员也搞不定!(2)

坑2: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++;
    }
}


以上代码的执行结果如下:


微信图片_20220120155857.jpg


② 原因分析


本以为执行的结果会是 2,但万万没想到竟然是 1,用马大师的话来讲:「我大意了啊,没有闪」。


有人可能会问:如果把代码换成 ++num,那么结果会不会是 2 呢?


很抱歉的告诉你,并不会,执行的结果依然是 1。那为什么会这样呢?想要真正的搞懂它,我们就得从这段代码的字节码说起了。


以上代码最终生成的字节码如下:


// class version 52.0 (52)
// access flags 0x21
public class com/example/basic/FinallyExample {
  // compiled from: FinallyExample.java
  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 5 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lcom/example/basic/FinallyExample; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
  // access flags 0x9
  public static main([Ljava/lang/String;)V throws java/io/FileNotFoundException 
   L0
    LINENUMBER 13 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    LDC "\u6267\u884c\u7ed3\u679c:"
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKESTATIC com/example/basic/FinallyExample.getValue ()I
    INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L1
    LINENUMBER 14 L1
    RETURN
   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    MAXSTACK = 3
    MAXLOCALS = 1
  // access flags 0xA
  private static getValue()I
    TRYCATCHBLOCK L0 L1 L2 null
   L3
    LINENUMBER 18 L3
    ICONST_1
    ISTORE 0
   L0
    LINENUMBER 20 L0
    ILOAD 0
    ISTORE 1
   L1
    LINENUMBER 22 L1
    IINC 0 1
   L4
    LINENUMBER 20 L4
    ILOAD 1
    IRETURN
   L2
    LINENUMBER 22 L2
   FRAME FULL [I] [java/lang/Throwable]
    ASTORE 2
    IINC 0 1
   L5
    LINENUMBER 23 L5
    ALOAD 2
    ATHROW
   L6
    LOCALVARIABLE num I L0 L6 0
    MAXSTACK = 1
    MAXLOCALS = 3
}



相关文章
|
2月前
|
安全 Java 程序员
代码救火队:try-catch-finally带你走出异常困境
代码救火队:try-catch-finally带你走出异常困境
29 0
|
12月前
|
JSON 缓存 安全
满屏的try-catch,你不瘆得慌?
满屏的try-catch,你不瘆得慌?
|
缓存 前端开发 Java
支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!
支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!
126 0
支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!
一个try-catch问出这么多花样【面试题】
一个try-catch问出这么多花样【面试题】
72 0
一个try-catch问出这么多花样【面试题】
|
存储 Oracle Java
try-catch-finally中的4个巨坑,老程序员也搞不定!
在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的“掌控”它,却并不是一件容易的事。别的不说,咱就拿 fianlly 来说吧,别看它的功能单一,但使用起来却“暗藏杀机”,若您不信,咱来看下面的这几个例子...
166 0
try-catch-finally中的4个巨坑,老程序员也搞不定!
|
前端开发 Java Spring
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
230 0
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
|
Java 编译器 程序员
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(一)
final 是 Java 中的关键字,它也是 Java 中很重要的一个关键字,final 修饰的类、方法、变量有不同的含义;finally 也是一个关键字,不过我们可以使用 finally 和其他关键字结合做一些组合操作;finalize 是一个不让人待见的方法,它是对象祖宗 Object 中的一个方法,finalize 机制现在已经不推荐使用了。本篇文章,cxuan 就带你从这三个关键字入手,带你从用法、应用、原理的角度带你深入浅出理解这三个关键字。
86 0
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(一)
读者被问题代码折磨,鸭哥劝 NullPointerException 耗子尾汁!!!
说起来,鸭哥也算是身经百战的码农了,代码习惯和风格都是不错的。没想到,今天大意了没有闪,NullPointerException 就找上门来了。
181 0
读者被问题代码折磨,鸭哥劝 NullPointerException 耗子尾汁!!!
|
Java 程序员
try-catch-finally中的4个巨坑,老程序员也搞不定!(1)
try-catch-finally中的4个巨坑,老程序员也搞不定!(1)
107 0
try-catch-finally中的4个巨坑,老程序员也搞不定!(1)
|
Java 程序员
try-catch-finally中的4个巨坑,老程序员也搞不定!(4)
try-catch-finally中的4个巨坑,老程序员也搞不定!(4)
88 0
try-catch-finally中的4个巨坑,老程序员也搞不定!(4)

热门文章

最新文章