在Java中如何使用watch表达式进行调试(通过具体示例)?

在Java中如何使用watch表达式进行调试(通过具体示例)?,java,debugging,constructor,watch,Java,Debugging,Constructor,Watch,您能帮助我理解在Java中如何使用Watch进行调试吗?在下面的评论中,我捕获了“监视”窗口中显示的值。 需要讨论的几个前期问题: 这个符号是什么意思,例如:“73” 当调用newtest(t2)来创建下一个对象时,t1=t2(正如构造函数所建议的)。在这个上下文中,t1是每个测试实例变量所具有的属性t1吗 测试对象(t1)的属性能否等于测试对象(t2)?在这种情况下,这是否意味着它们指向相同的对象,因此它们存储相同的地址 为什么#73是t3.t1的值?是因为在使用参数运行构造函数之后t1=t2

您能帮助我理解在Java中如何使用Watch进行调试吗?在下面的评论中,我捕获了“监视”窗口中显示的值。 需要讨论的几个前期问题:

  • 这个符号是什么意思,例如:“73”

  • 当调用newtest(t2)来创建下一个对象时,t1=t2(正如构造函数所建议的)。在这个上下文中,t1是每个测试实例变量所具有的属性t1吗

  • 测试对象(t1)的属性能否等于测试对象(t2)?在这种情况下,这是否意味着它们指向相同的对象,因此它们存储相同的地址
  • 为什么#73是t3.t1的值?是因为在使用参数运行构造函数之后t1=t2吗?t3.t1=#73是因为t1=t2,但同时我们不能使用t3.t2符号,因为t2在类测试中没有声明为变量,这不是有点矛盾吗
  • 代码如下:

    class Test {
        Test t1;
        Test() {}
        Test (Test t) { 
            t1=t;
        }
        public static void main (String[] args)
        {
            Test t2 = new Test();   // t2 #73 ; t2.t1 null ; t1 = cannot access instance variable from static context
            Test t3 = new Test(t2);  // t3 #74 ; t3.t1 #73 ; t1 = cannot access instance variable from static context
            t3.go(); // prints "hi"
            Test t4 = t3.t1; // t4 #73 ; t4.t1 null
            t4.go(); // prints "hi"
            Test t5 = t2.t1; // t5 null
            t5.go(); // NullPointerException (is it because a null object can't invoke any method?)
        }
    
        void go() { System.out.println("hi");
        }
    
    }
    
    PS:使用Netbeans,我按照以下步骤调试和显示手表:

    • 右键单击并在代码行上设置断点
    • 按住Ctrl+Shift+F5键以调试文件
    • 进入(F7)
    • 跨步表达式(F8)
    在显示的监视窗口中,我在+符号上添加了变量或表达式,我可以在“跨过”时监视这些变量或表达式

  • 我假设它是某种内部netbeans id。其他人会证明这一点Test@abdef943c.

  • 因为t1不是静态的,所以它是每个实例的。所以你将t1设置为t3,而不是t2/4/5

  • 有点……在t1中,您不存储实际对象,而是存储指向该对象引用的指针。这意味着t3.t1可以指向t2,而t4.t1可以指向同一对象

  • 因为您已经很好地调试过了,所以您知道哪些值是空的,现在希望您知道原因,并且很容易修复