Discussion:
[問題] 在建構子殺掉自己的問題
(时间太久无法回复)
╮(╯3╰)╭
2007-03-20 12:13:11 UTC
Permalink
大家好!
當我在建構子想要殺掉自己的時候,遇到一個奇怪的問題
下面程式描述一個class "Tester" 在建構子中新增另一個class AnotherClass
而AnotherClass則在建構子中呼叫母類別的killAnotherClass()殺掉自己

public class Tester {
AnotherClass aClass = null;
public Tester() {
aClass = new AnotherClass(this);
if(aClass == null)
System.out.println("aClass == null");
else
System.out.println("aClass != null");
}
public void killAnotherClass() {
aClass = null;
}
class AnotherClass {
AnotherClass(Tester parent) {
parent.killAnotherClass();
}
}
public static void main(String[] argv) {
new Tester();
}
}

奇怪的是,最後程式印出 aClass != null
難道killAnotherClass()失靈了嗎?

接著為了測試killAnotherClass有確實的被執行,我把程式稍微改寫如下:

public class Tester {
AnotherClass aClass = null;
public Tester() {
aClass = new AnotherClass(this, "name a");
if(aClass == null)
System.out.println("aClass == null");
else
System.out.println(aClass.name);
}
public void killAnotherClass() {
aClass = new AnotherClass(this, "name b");
}
class AnotherClass {
String name;
AnotherClass(Tester parent, String _name) {
name = _name;
parent.killAnotherClass();
}
}
public static void main(String[] argv) {
new Tester();
}
}

結果竟然出現可怕的java.lang.StackOverflowError

請問是哪裡出了問題?


謝謝 :Q

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.188.75
小白退散!
2007-03-20 12:29:19 UTC
Permalink
100% stack overflow....

你這是無窮的間接遞迴(Recursive)....



※ 引述《***@ptt.cc (╮(╯3╰)╭)》之銘言:
: 大家好!
: 當我在建構子想要殺掉自己的時候,遇到一個奇怪的問題
: 下面程式描述一個class "Tester" 在建構子中新增另一個class AnotherClass
: 而AnotherClass則在建構子中呼叫母類別的killAnotherClass()殺掉自己
: public class Tester {
: AnotherClass aClass = null;
: public Tester() {
: aClass = new AnotherClass(this);
: if(aClass == null)
: System.out.println("aClass == null");
: else
: System.out.println("aClass != null");
: }
: public void killAnotherClass() {
: aClass = null;
: }
: class AnotherClass {
: AnotherClass(Tester parent) {
: parent.killAnotherClass();
: }
: }
: public static void main(String[] argv) {
: new Tester();
: }
: }
: 奇怪的是,最後程式印出 aClass != null
: 難道killAnotherClass()失靈了嗎?
: 接著為了測試killAnotherClass有確實的被執行,我把程式稍微改寫如下:
: public class Tester {
: AnotherClass aClass = null;
: public Tester() {
: aClass = new AnotherClass(this, "name a");
: if(aClass == null)
: System.out.println("aClass == null");
: else
: System.out.println(aClass.name);
: }
: public void killAnotherClass() {
: aClass = new AnotherClass(this, "name b");
: }
: class AnotherClass {
: String name;
: AnotherClass(Tester parent, String _name) {
: name = _name;
: parent.killAnotherClass();
: }
: }
: public static void main(String[] argv) {
: new Tester();
: }
: }
: 結果竟然出現可怕的java.lang.StackOverflowError
: 請問是哪裡出了問題?
: 謝謝 :Q
--
╭──── Origin:<不良牛牧場> bbs.badcow.com.tw (210.200.247.200)─────╮
│  ↘ Welcome to SimFarm BBS -- From : [59.112.103.49] │
╰◣◣◢ ◢◢《不良牛免費撥接→電話:40586000→帳號:zoo→密碼:zoo》 ◣◣◢ ─╯
╮(╯3╰)╭
2007-03-20 13:36:19 UTC
Permalink
※ 引述《***@bbs.badcow.com.tw (小白退散!)》之銘言:
: 100% stack overflow....
: 你這是無窮的間接遞迴(Recursive)....
確實 第二個程式犯了間接遞迴的錯誤
不過第一支程式出了什麼問題呢?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.188.75
!H45
2007-03-20 13:39:45 UTC
Permalink
※ 引述《montreal (╮(╯3╰)╭)》之銘言:
: ※ 引述《***@bbs.badcow.com.tw (小白退散!)》之銘言:
: : 100% stack overflow....
: : 你這是無窮的間接遞迴(Recursive)....
: 確實 第二個程式犯了間接遞迴的錯誤
: 不過第一支程式出了什麼問題呢?

第一支程式的

something = null;

並不等效於 kill something......

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.205.85
godfat 真常
2007-03-20 13:42:57 UTC
Permalink
※ 引述《montreal (╮(╯3╰)╭)》之銘言:
: public class Tester {
: AnotherClass aClass = null;
: public Tester() {
: aClass = new AnotherClass(this);
^^^^^^^^^^^^^^^^^^^^^^
這裡把 aClass 設為 null, 然後呢?
new 會傳回東西是吧?
所以 aClass != null

: if(aClass == null)
: System.out.println("aClass == null");
: else
: System.out.println("aClass != null");
: }
: public void killAnotherClass() {
: aClass = null;
: }
: class AnotherClass {
: AnotherClass(Tester parent) {
: parent.killAnotherClass();
^^^^^^
其實 nested class 本身就有 pointer/reference 指向 enclosing class
所以這邊不用吃 parent, 直接 killAnotherClass(); 即可
多傳 parent 就變傳兩次了(其中一次是 compiler 幫你做掉的)
: }
: }


: public void killAnotherClass() {
: aClass = new AnotherClass(this, "name b");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
c'tor 還沒結束又再次喚起,你知道了
基本上 stack 會 overflow 大概有 99% 是無窮遞迴

: }
: class AnotherClass {
: String name;
: AnotherClass(Tester parent, String _name) {
: name = _name;
: parent.killAnotherClass();
: }
: }

--
Hear me exalted spirits. Hear me, be you gods or devils, ye who hold
dominion here:
I am a wizard without a home. I am a wonderer seeking refuge.

Sacrifice

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.30.220

Loading...