Java在Debug的時候,有些變量能無限展開(循環了)?

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

相關文章
相關標籤/搜索