2012-08-05 120 views
4

喜檢查下面的代碼字符串緩衝區字符串轉換異常?

ArrayList x=new ArrayList(); 
    ArrayList<String>y=x; 
    ArrayList<StringBuffer>z=x; 
    y.add("Strings"); 
    System.out.println(z.get(0).toString()); 

正在逐漸類轉換異常時的System.out.println

java.lang.ClassCastException: java.lang.String 
at com.one.MainClass.main(MainClass.java:16) 

但是,當我試圖

System.out.println(z.get(0)) 

,它正在 爲什麼來了??

+2

你想達到什麼目的? – AlanFoster 2012-08-05 15:42:17

+0

請不要在使用StringBuilder時使用StringBuffer。 – 2012-08-13 07:58:12

回答

1

的細節,爲什麼你得到你的問題是這樣的:

  • 新的ArrayList創建,空
  • 所有元素類型爲String y中
  • 所有元素都輸入到的StringBuffer在z
  • 將新元素添加到此數組列表中。
  • JVM嘗試將其轉換爲BOTH字符串和StringBuffer
  • 由於「字符串」不是StringBuffer的實例,因此拋出了ClassCastException。

爲了避免這種情況,請不要爲String和StringBuffer類型輸入數組。只選擇一個。例如:

ArrayList<StringBuffer> myArrayList = new ArrayList<StringBuffer> 

如果你想爲一個字符串數組列表複製到一個StringBuffer ArrayList中,你必須遍歷所有Z中的項目將它們轉換爲字符串緩衝區:

ArrayList x=new ArrayList(); 
ArrayList<String>y=x; 
ArrayList<StringBuffer>z=new ArrayList<StringBuffer>(); 
for(String s : y) 
    z.add(new StringBuffer(s)); 

原因是StringBuffer沒有擴展String。造成問題的原因是您無法投射字符串,比如說「str」指向StringBuffer,即您無法執行StringBuffer s = (StringBuffer)"str";

要將ArrayList x投射到ArrayList<T>,所有x元素必須擴展或成爲T的實例。

另外,您應該儘可能使用泛型類型。如果你不知道會是什麼(例如)在列表中,使用方法:

ArrayList<?> x = new ArrayList<?>(); 

如果你知道更多一點,比如,這將是另一個類的子類,使用 ArrayList<? extends T>ArrayList<? implements T>。這將幫助您避免將來的ClassCastExceptions。

2

我假設你正在做這個實驗(如果沒有,那麼請閱讀關於你應該如何編寫代碼的其他答案)。

x是一個原始的ArrayList,您可以在其中放置任何類型的對象。

y.add("string")增加了一個字符串。

z是ArrayList<StringBuffer>並且期望StringBuffers。當您調用z.get(0)時,JVM嘗試將索引爲0的元素轉換爲StringBuffer,然後再返回。該投射失敗。

換句話說,雖然StringBuffer s = z.get(0);編譯,它會在運行時拋出一個ClassCastException,因爲z.get(0)不是StringBuffer