一个try-catch问出这么多花样【面试题】

简介: 一个try-catch问出这么多花样【面试题】

源码


下面代码的返回结果是1不是2,下面从字节码的角度分析一下原因


public class Start {
  public static void main(String[] args) {
    int demo = demo();
    System.out.println(demo);
  }
  public static int demo() {
    int x = 1;
    try {
      return x;
    } finally {
      x = 2;
    }
  }
}


代码字节码分析


获取方法的字节码命令为


javap -v xxx.class


上面代码的字节码部分如下图所示(其中红色的字为解析,下面会对详细内容进行解释)


9.png


首先要明确该段代码中有一个操作数栈和局部变量表,如下图所示


1.png


当程序执行 int x = 1,时会有两个操作,常量1会压入操作数栈栈顶,然后弹出栈顶元素赋值为局部变量表的x的位置,对应字节码中的0: iconst_1 , 1: istore_0 ,如下图所示


2.png


然后执行try-catch-finally中的方法,用到x,所以执行字节码 2: iload_0,命令,把局部变量表中的0号位置数据加载到操作数栈栈顶。如下图所示。


3.png


接下来执行 3: istore_1 方法,把操作数栈顶元素保存到局部变量表1号位置,如下图所示


4.png


接下来执行4: iconst_2 , 5: istore_0 字节码,即x = 2的代码,把2压入到操作数栈栈顶中,把栈顶元素保存到局部变量表0号位置中,如下图所示。


5.png


最后执行 6: iload_1 , 7: ireturn 字节码,把局部变量表1号位置上数据压入到操作数栈栈顶,返回操作数栈顶元素,如下图所示


6.png


源码拓展


如果代码想返回2,可以有如下操作


public static int demo() {
    int x = 1;
    try {
      return x;
    } finally {
      x = 2;
      return x;
    }
  }


或者


public static int demo() {
    int x = 1;
    try {
    } finally {
      x = 2;
    }
    return x;
  }


字节码命令部分介绍


iconst_n


把n压入到操作数栈栈顶,n为表示具体的操作值,比如int x =5,则执行iconst_5命令。

不过也有其他的命令,当int取值-1~ 5采用iconst指令,取值-128~ 127采用bipush指令,取值-32768~ 32767采用sipush指令,取值-2147483648~2147483647采用 ldc 指令。


 int x =1;
 int y =11;


对应的字节码如下图所示


7.png


istore_n


把操作数栈栈顶元素保存到局部变量表n号位置


iload_n


把局部变量表n号位置的数据压入到操作数栈栈顶


目录
相关文章
|
7月前
|
安全 Java 程序员
🚀JAVA异常处理“三部曲”:try-catch-finally带你征服编程的星辰大海!
【6月更文挑战第18天】Java异常处理的`try-catch-finally`是编程探险中的导航系统,确保程序在异常时安全航行。`try`捕获异常,`catch`处理异常,`finally`保证关键清理代码执行。通过实例展示了如何在文件读取中应用这一机制,即使遇到错误也能优雅退出,它是Java程序员征服技术高峰的关键工具。
95 0
|
5月前
|
搜索推荐 大数据 数据处理
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
面试官:try-catch 到底写在循环里面好,还是外面好?大部分人都会答错!
60 0
|
8月前
|
安全 Java 程序员
代码救火队:try-catch-finally带你走出异常困境
代码救火队:try-catch-finally带你走出异常困境
60 0
【面试题精讲】try-catch-finally 如何使用?
【面试题精讲】try-catch-finally 如何使用?
因为一道题,我把 try-catch-finally 的细节都整理了一遍(1500字)
原因:return i++; 在内部是可以分为三步,① int tmp = i; ② i += 1; ③ return tmp;
105 0
因为一道题,我把 try-catch-finally 的细节都整理了一遍(1500字)
|
前端开发 Java Spring
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
281 0
求求你不要写满屏的 try...catch 了,这才是优雅的处理方式,真香...
|
存储 Oracle Java
try-catch-finally中的4个巨坑,老程序员也搞不定!
在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的“掌控”它,却并不是一件容易的事。别的不说,咱就拿 fianlly 来说吧,别看它的功能单一,但使用起来却“暗藏杀机”,若您不信,咱来看下面的这几个例子...
207 0
try-catch-finally中的4个巨坑,老程序员也搞不定!
|
Java Unix 编译器
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(二)
final 是 Java 中的关键字,它也是 Java 中很重要的一个关键字,final 修饰的类、方法、变量有不同的含义;finally 也是一个关键字,不过我们可以使用 finally 和其他关键字结合做一些组合操作;finalize 是一个不让人待见的方法,它是对象祖宗 Object 中的一个方法,finalize 机制现在已经不推荐使用了。本篇文章,cxuan 就带你从这三个关键字入手,带你从用法、应用、原理的角度带你深入浅出理解这三个关键字。
165 0
看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了(二)
读者被问题代码折磨,鸭哥劝 NullPointerException 耗子尾汁!!!
说起来,鸭哥也算是身经百战的码农了,代码习惯和风格都是不错的。没想到,今天大意了没有闪,NullPointerException 就找上门来了。
221 0
读者被问题代码折磨,鸭哥劝 NullPointerException 耗子尾汁!!!
|
Java 程序员
try-catch-finally中的4个巨坑,老程序员也搞不定!(6)
try-catch-finally中的4个巨坑,老程序员也搞不定!(6)
142 0
try-catch-finally中的4个巨坑,老程序员也搞不定!(6)

热门文章

最新文章