//: CrashJava.java // One way to crash Java import java.util.*;
public class CrashJava { public String toString() { return "CrashJava address: " + this + "/n"; } public static void main(String[] args) { Vector v = new Vector(); for(int i = 0; i < 10; i++) v.addElement(new CrashJava()); System.out.PRintln(v); } } ///:~
若只是簡單地創建一個CrashJava對象,并將其打印出來,就會得到無窮無盡的一系列違例錯誤。然而,假如將CrashJava對象置入一個Vector,并象這里演示的那樣打印Vector,就不會出現什么錯誤提示,甚至連一個違例都不會出現。此時Java只是簡單地崩潰(但至少它沒有崩潰我的操作系統)。這已在Java 1.1中測試通過。 此時發生的是字串的自動類型轉換。當我們使用下述語句時: "CrashJava address: " + this 編譯器就在一個字串后面發現了一個“+”以及好象并非字串的其他東西,所以它會試圖將this轉換成一個字串。轉換時調用的是toString(),后者會產生一個遞歸調用。若在一個Vector內出現這種事情,看起來堆棧就會溢出,同時違例控制機制根本沒有機會作出響應。 若確實想在這種情況下打印出對象的地址,解決方案就是調用Object的toString方法。此時就不必加入this,只需使用super.toString()。當然,采取這種做法也有一個前提:我們必須從Object直接繼續,或者沒有一個父類覆蓋了toString方法。