抛异常的时候,Java Debug 时,有些变量能无限展开,怎么做到的?
先来一个报错的例子:
Exception in thread "main" java.lang.StackOverflowError
at llj.mf.ace.C.<init>(C.java:3)
at llj.mf.ace.B.<init>(B.java:5)
at llj.mf.ace.C.<init>(C.java:5)
at llj.mf.ace.B.<init>(B.java:5)
at llj.mf.ace.C.<init>(C.java:5)
at llj.mf.ace.B.<init>(B.java:5)
at llj.mf.ace.C.<init>(C.java:5)
at llj.mf.ace.B.<init>(B.java:5)
....
....
报错的代码:
public class Ace { public static void main(String[] args) { new B(); } } public class B { C c = new C(); } public class C { B b = new B(); }
报错的原因:创建 B 对象的时候,B 对象会创建一个 C 对象,C 对象又会创建一个 B 对象,。。。这个会创建无数个 B 对象、C 对象,所以就 StackOverflowError 了
能无限展开的例子:
/** * 这个debug的时候,有无限个下级(循环了)(你中有我,我中有你) */ public class BCBC { public static void main(String[] args) { B b = new B(); C c = new C(); b.c = c; c.b = b; System.out.println(b.equals(c)); // 断点处 } static class B { C c; } static class C { B b; } }
上面示例 Debug 截图:
这里只创建了一个 B 对象、一个 C 对象,然后互相引用了而已(指向对方的地址)。(我指着你,你指着我: B <------> C)
这就解释了,为什么抛异常的时候,Java Debug 时,有些变量能无限展开
时间: 2024-11-06 10:55:49