我有一小部分代码,我想知道调试器是怎么想的。
/**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在那里执行该方法,然后它将转到
Line13,因为它是一个评论。它不执行它,然后转到
第14行,在那里,它使玩家的对象->保留了多少玩家需要的空间。将默认的-构造函数给予和引用(指针命名为p1)调用Player的类型,并将Playerobject放入播放器。内弗林,现在它转到
第15行它执行。现在它到了
第17行是一个注释,然后转到
18号线 "?“现在我糊涂了。当我调试代码->时,它会出现在第17行到第19行之后,而不是第18行或第21行,或者我很长时间以来认为编译器是如何从分号开始的,从右到左。
在Line19之后,它跳过其他行并转到
第26行 ->在哪里,行18,22-25,什么时候执行这一行。当我忘记Line25上的分号时,调试器将如何/何时识别?
我用断点一步一步地调试了我的代码。输出很好。对于此问题,代码Player.java文件并不重要。如果有什么东西丢失或不能理解,请告诉我,我可以添加或更改它。
发布于 2019-07-04 14:00:17
调试器本身看不到这些行,因为这些行上没有什么有趣的事情发生。
第18行是类型声明,第19行的p2很有趣,因为p2的引用值在=之后被分配和赋值。
然后跳到下一个执行,即第26行。
您可以将其扩展到多行,但调试器运行的是编译后的代码,其中包含某些“钩子”,指向原始源代码中的位置。
通常,您只需在一行中对其进行编码,调试器就是这样设置的。如果您希望看到更多详细信息,请使用step into选项而不是step over。
基本上,调试器会显示代码中的点,在代码中,事情发生了变化,状态得到了更新。当调试器在这些行上暂停时,您可以检查变量的值和对象的状态等等.它不会在您介绍的代码中看到任何其他东西或工件,只有在创建新事物、赋值或更改时才会看到。只有有趣的东西,在发生的时候,您可以分析传递给方法的值、从方法返回的值、新的实例化类状态等等.看看一切是否都像雨一样正常。
问问你自己,what value would I gain if the debugger paused on line 24?绝对什么都没有。有趣的部分发生在分配p2之前和p2分配之后,或者发生在Player()的构造函数中,您可以选择进入该构造函数,或者当抛出Exception时。
https://stackoverflow.com/questions/56888979
复制相似问题