2015-01-11 25 views
3

我試圖理解下面的代碼塊後面的執行邏輯:ClassCastException異常多立體的陣列中的Java

Integer[][] mdArray = new Integer[][] { { 1, 2 }, { 3, 4 }, { 5, 6 }, 
     { 7, 8 } }; 

List<Integer[]> mdArrayList = new ArrayList<Integer[]>(); 

// Iterate through every row of mdArray 
for (Integer[] obj : mdArray) { 
    mdArrayList.add(obj); 
} 

/* Throws ClassCastException because it cannot resolve the final array size? 
* 
* i.e. it is a proper RTError. 
* 
*/ 
Integer[][] toArray = (Integer[][]) (mdArrayList.toArray()); 

以上代碼編譯好但在執行最後一行時在運行時將引發一個ClassCastException。我的理解是,JVM無法在運行時執行此代碼,因爲即使toArray()在mdArrayList中抽取了一組元素,目標類型也無法解析或提升爲有效的類型?

任何解釋將不勝感激!我只是想了解是否必須避免這種代碼執行,或者是否需要異常處理來滿足用戶需求。

+0

'List.toArray'返回一個'對象[]'。它會如何做其他事情? –

+0

@BoristheSpider是的,我知道它的確如此。我的問題是如何決定如何將其解析爲MD數組。感謝您的評論。 – ha9u63ar

+0

Java中沒有這樣的MD數組。 –

回答

4

你不應該鑄造。將Integer[][]傳遞給toArray。像

Integer[][] toArray = mdArrayList.toArray(new Integer[][] {}); 
System.out.println(Arrays.deepToString(toArray)); 

輸出的東西是

[[1, 2], [3, 4], [5, 6], [7, 8]] 
+0

或'Integer [] [] :: new'。 –

+0

@BoristheSpider是Java8的人! – ha9u63ar

+0

@BoristheSpider上面也適用於Java7,但在四月... :) –

2

嘗試

Integer[][] toArray = mdArrayList.toArray(new Integer[mdArrayList.size()][]); 

如果不提供的參數來toArray方法,返回類型總是會Object[]無論實際類型是什麼列表裏面。

如果你確實提供了一個參數,你可以選擇使它成爲一個零長度數組(new Integer[0][]),在這種情況下,toArray方法將創建一個相同類型的新數組;或者如果正確的大小,你可以提供一個數組,然後toArray方法將使用該數組。後者比前者稍微更有效率,但不是你需要擔心得多的東西。

+0

不錯。感謝解釋而不是解決問題。我剛剛通過關於toArray(Object [] obj)的API文檔進行了第二次讀取,並且它表示如果沒有指定類型和大小,它會返回默認的Object [] - 就在我想我讀取所有內容時。 – ha9u63ar