我有一小段代码,我想知道调试器的想法。
/**L05*/ public class Main {
/**L06*/ public static void sp(String a){
/**L07*/ System.out.println(a);
/**L08*/ }
/**L09*/
/**L10*/ public static void main(String[] args) {
/**L11*/ sp("start");
/**L12*/
/**L13*/ //object-1
/**L14*/ Player p1 = new Player();
/**L15*/ sp("p1");
/**L16*/
/**L17*/ //object-2
/**L18*/ Player
/**L19*/ p2
/**L20*/ =
/**L21*/ new
/**L22*/ Player
/**L23*/ (
/**L24*/ )
/**L25*/ ;
/**L26*/ sp
/**L27*/ (
/**L28*/ "p2"
/**L29*/ )
/**L30*/ ;
/**L31*/
/**L32*/ //object-3
/**L33*/ Player p3= new Player(){/**strange that this works*/};
/**L34*/ Player p4=
/**L35*/ new Player();
/**L36*/ Player p5;
/**L37*/ }
/**L38*/ }
我想知道第18行到30行的执行过程。
例如,当我调试代码(从第11行开始)时,它会逐步进行,因此:
Line11 在那里执行方法,然后转到
第13行 因为这是一条评论。它不执行它,然后转到
第14行 在那里,它成为播放器的对象->保留播放器需要多少空间。 调用默认构造函数 给出并引用(称为p1的指针)类型的Player,并将Player对象放入Player。现在进入Endofline
第15行 它执行。现在转到
第17行 它的评论,然后转到
第18行 “?”现在我很困惑。当我调试代码 ->它在17号线之后到达19号线,而不是18号线或21号线 或我长期以来认为编译器从分号的右侧开始并从右向左移动。
第19行 之后,它会跳过其他行并转到
第26行 奇怪->在执行此行时,第18,22-25行在哪里。 当我在Line25上忘记了分号时,调试器将如何识别/何时识别?
我已经使用断点逐步调试了代码。 输出正常。 代码Player.java文件对于此问题并不重要。 如果缺少或无法理解,请告诉我,我可以添加或更改。
答案 0 :(得分:1)
调试器本身看不到这些行,因为这些行上没有发生任何有趣的事情。
第18行是类型声明,第19行的p2很有趣,因为在那里分配了p2的参考值,并在=之后分配了值。
然后跳到下一次执行,即第26行。
您将其散布在多行中,但是调试器运行的是编译后的代码,其中包含某些“钩子”,这些钩子指向原始源代码中的位置。
通常,您会在一行中编写代码,这就是设置调试器的方式。如果您希望查看更多详细信息,请使用“进入”选项而不是“跳过”。
基本上,调试器会向您显示代码中发生变化和状态更新的点。当调试器在这些行上暂停时,您可以检查变量的值和对象的状态等。 仅当创建新事物,分配或更改值时,它才会在您引入的代码中看不到任何其他事物或工件。在发生事件时,只有有趣的东西,因此您可以分析传递给方法的值,从方法返回的值,新的实例化类状态等,以查看是否一切如雨后春笋。
问问自己,what value would I gain if the debugger paused on line 24?
完全没有。有趣的部分发生在分配p2
之前,分配p2
之后或{ {1}},您可以选择进入其中,或者在抛出Player()
时选择。