無意識的遞迴

奮鬥的小青年_發表於2017-01-08

在我們寫程式的時候經常會用到toString()的方法,但是這種方法有時候會造成無意識的遞迴。下面看程式碼:

import java.util.ArrayList;
import java.util.List;

/**
 * Created by msc on 2017/1/8.
 */
public class InfiniteRecursion {
    @Override
    public String toString() {
        return "InfiniteRecursion address: "+this+"\n";
    }

    public static void main(String[] args) {
        List<InfiniteRecursion> v=new ArrayList<InfiniteRecursion>();
        for (int i=0;i<10;i++){
            v.add(new InfiniteRecursion());
        }
        System.out.println(v);
    }
}

刪除程式碼的toString()方法是列印InfiniteRecursion類的物件的記憶體地址。

我們都知道在這裡this就是代表了當前物件,當this關鍵字和字串連線的時候,也會轉換成該物件的地址,會呼叫toString()方法,而這個this原本就在toString()方法中,會造成什麼後果呢?就是永遠地在遞迴呼叫,直到堆疊溢位。下面看執行上述程式碼所報的異常。

Exception in thread "main" java.lang.StackOverflowError
	at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
    ……

那麼我們想要檢視InfiniteRecursion類的地址應該怎麼做呢?可以通過呼叫其父類的toString()方法來實現,雖然InfiniteRecursion這個類沒有明確的繼承某個類,但是我們知道所有的類都是預設繼承Object類的。

import java.util.ArrayList;
import java.util.List;

/**
 * Created by msc on 2017/1/8.
 */
public class InfiniteRecursion {
    @Override
    public String toString() {
        return "InfiniteRecursion address: "+super.toString()+"\n";
    }

    public static void main(String[] args) {
        List<InfiniteRecursion> v=new ArrayList<InfiniteRecursion>();
        for (int i=0;i<10;i++){
            v.add(new InfiniteRecursion());
        }
        System.out.println(v);
    }
}

看執行結果:

[InfiniteRecursion address: InfiniteRecursion@4554617c
, InfiniteRecursion address: InfiniteRecursion@74a14482
, InfiniteRecursion address: InfiniteRecursion@1540e19d
, InfiniteRecursion address: InfiniteRecursion@677327b6
, InfiniteRecursion address: InfiniteRecursion@14ae5a5
, InfiniteRecursion address: InfiniteRecursion@7f31245a
, InfiniteRecursion address: InfiniteRecursion@6d6f6e28
, InfiniteRecursion address: InfiniteRecursion@135fbaa4
, InfiniteRecursion address: InfiniteRecursion@45ee12a7
, InfiniteRecursion address: InfiniteRecursion@330bedb4
]




相關文章