抛异常的时候,Java Debug 时,有些变量能无限展开,怎么作到的?java
先来一个报错的例子:spa
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)
....
.... debug
报错的代码:对象
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 了blog
能无限展开的例子:it
/** * 这个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 截图:io
这里只建立了一个 B 对象、一个 C 对象,而后互相引用了而已(指向对方的地址)。(我指着你,你指着我: B <------> C)class
这就解释了,为何抛异常的时候,Java Debug 时,有些变量能无限展开thread