gpt4 book ai didi

java 一步步编译/执行/调试

转载 作者:行者123 更新时间:2023-12-02 09:43:10 26 4
gpt4 key购买 nike

我有一小段代码,我想知道调试器是如何思考的。

/**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 行开始),它会一步一步进行:

第 11 行在那里它执行该方法,然后转到

第 13 行因为它是一条评论。它不执行它,然后转到

第 14 行在那里它创建了一个 Player 的对象 -> 保留 Player 需要的空间。调用默认构造函数给出并引用(名为 p1 的指针)Player 的类型,并将 Player 对象放入 Player 中。下线现在转到

第 15 行它执行。现在转到

第 17 行这是一条评论,然后转到

第 18 行“?”现在我很困惑。当我调试代码时-> 它在 17 号线之后到 19 号线,而不是到 18 号线或 21 号线或者我长期以来一直认为编译器从分号的右侧开始,从右到左。

Line19之后,它会跳过其他行并转到

第 26 行奇怪 -> 第 18,22-25 行在哪里,何时执行这些行。当我忘记了 Line25 上的分号时,调试器如何/何时识别?

我已经用断点一步步调试了我的代码。输出是好的。代码 Player.java 文件对于这个问题并不重要。如果有遗漏或无法理解的内容,请告诉我,我可以添加或更改它。

最佳答案

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

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

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

您将其分散在多行中,但调试器会运行已编译的代码,其中包含某些指向原始源代码中位置的“钩子(Hook)”。

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

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

问问自己,如果调试器在第 24 行暂停,我会获得什么值(value)? 绝对没有。有趣的部分发生在 p2 之前被赋值并且在p2被赋值之后,或者在Player()的构造函数中,您可以选择单步执行,或者当Exception被赋值时抛出。

关于java 一步步编译/执行/调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56888979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com