gpt4 book ai didi

compiler-construction - Java - 在没有初始化之前在调试中看不到变量

转载 作者:行者123 更新时间:2023-12-04 08:38:31 24 4
gpt4 key购买 nike

在 jdk6 中给出 Java 中的以下方法

public void test(){
Integer i;
try{
i = 9;
} catch (Exception ex){
//nothing
}
int something = 1; //Breakpoint here
}

当我在断点处停止时,我根本看不到堆栈上的变量“i”,即使我一步一步地看到它在 try 块中被分配了 9。
public void test(){
Integer i = null;
try{
i = 9;
} catch (Exception ex){
//nothing
}
int something = 1; //Breakpoint here
}

将变量“i”初始化为 null 当我到达断点时,我会看到 i = 9。

我只是想知道引擎盖下会发生什么。在第一种情况下,编译器是否没有将 i 放在堆栈上,或者原因是否源于 JVM 行为本身。

最佳答案

我假设您的问题中“我根本没有在堆栈上看到变量“i””意味着您在调试器的堆栈框架中看不到它。 (与在 JVM 操作数堆栈上相反,这是一个字节码级别的概念。它也不会在操作数堆栈上,但出于不同的原因。)

这是javap (反汇编 Java .class 文件)您的方法的输出:

  public void test();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: bipush 9
2: invokestatic #8 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: goto 10
9: astore_2
10: iconst_1
11: istore_2
12: return
Exception table:
from to target type
0 6 9 Class java/lang/Exception
LineNumberTable:
line 27: 0
line 30: 6
line 28: 9
line 31: 10
line 32: 12
LocalVariableTable:
Start Length Slot Name Signature
10 0 2 ex Ljava/lang/Exception;
0 13 0 this LExample;
6 3 1 i Ljava/lang/Integer;
12 1 2 something I

当您在注释行(我的源文件中的第 31 行)上设置断点时,您将在字节码索引 10(基于 LineNumberTable)设置断点。 LocalVariableTable显示 i仅存在于索引 6 到 9,因此为什么您的调试器不显示它。请注意 i的存储位置,局部变量槽1,在方法中没有被覆盖;即使变量不再存在,一些调试器也会利用这一点来显示值。 (如果你使用字节码优化器/混淆器/打包器等,它可能会改变字节码以重用局部变量槽,使字节码更小、更难调试或更可压缩。当然它可能会在同时。)

关于compiler-construction - Java - 在没有初始化之前在调试中看不到变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com