java逐步编译/执行/调试

时间:2019-07-04 13:24:47

标签: java debugging execution execute

我有一小段代码,我想知道调试器的想法。

/**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*/ } 

code1

我想知道第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文件对于此问题并不重要。 如果缺少或无法理解,请告诉我,我可以添加或更改。

1 个答案:

答案 0 :(得分:1)

调试器本身看不到这些行,因为这些行上没有发生任何有趣的事情。

第18行是类型声明,第19行的p2很有趣,因为在那里分配了p2的参考值,并在=之后分配了值。

然后跳到下一次执行,即第26行。

您将其散布在多行中,但是调试器运行的是编译后的代码,其中包含某些“钩子”,这些钩子指向原始源代码中的位置。

通常,您会在一行中编写代码,这就是设置调试器的方式。如果您希望查看更多详细信息,请使用“进入”选项而不是“跳过”。

基本上,调试器会向您显示代码中发生变化和状态更新的点。当调试器在这些行上暂停时,您可以检查变量的值和对象的状态等。 仅当创建新事物,分配或更改值时,它才会在您引入的代码中看不到任何其他事物或工件。在发生事件时,只有有趣的东西,因此您可以分析传递给方法的值,从方法返回的值,新的实例化类状态等,以查看是否一切如雨后春笋。

问问自己,what value would I gain if the debugger paused on line 24? 完全没有。有趣的部分发生在分配p2之前,分配p2之后或{ {1}},您可以选择进入其中,或者在抛出Player()时选择。