拋異常的時候,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