中的Java中使用以下方法
public void test(){
Integer i;
try{
i = 9;
} catch (Exception ex){
//nothing
}
int something = 1; //Breakpoint here
}
当我停在休息点时,我根本看不到堆栈上的变量“ i”,即使逐步进行,我看到这是在Try Block中分配的9。
public void test(){
Integer i = null;
try{
i = 9;
} catch (Exception ex){
//nothing
}
int something = 1; //Breakpoint here
}
原始化变量“ i”到null,当我到达断点时,我会看到i = 9。 我只是想知道引擎盖下会发生什么。在第一种情况下,编译器不会在堆栈上放置,还是原因是JVM行为本身。
我假设“我在问题上都没有在堆栈上看到“ i”的变量“ i”,这意味着您在调试器中的堆栈框架中看不到它。 (与JVM操作数堆栈相反,这是一个字节级级别的概念。它也不会在操作数堆栈上,而是出于不同的原因。)
HERHERE的javap
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。一些辩论者将利用这一点来显示该价值,即使变量不再存在。 (如果您使用字节码优化器/obfuscator/packer/etc,它可能会更改intecode以重复使用本地变量插槽以使字节码更小,更难调试或更可压缩。当然,它可能会完全删除调试信息同一时间。)