java-在没有初始化之前,请勿在调试中看到变量

问题描述 投票:0回答:1
在JDK6

中的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

(拆卸Java .class Files)输出您的方法:
jvm stack
1个回答
1
投票
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以重复使用本地变量插槽以使字节码更小,更难调试或更可压缩。当然,它可能会完全删除调试信息同一时间。)
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.