2012-06-04 44 views
1

我正試圖在我的代碼中處理大量源自單個臨界點的ClassCastExceptions。我將從提供這個問題的一些背景信息開始將對象轉換爲Java中的雙精度

我正在從csv文件中讀取不同類型的值。以下是保存它們的類的快照。

public class Row { 
private Object[] data; 

public Object getAtIndex(int i) 
{ 
    return data[i]; 
} 
} 

用於保持文件的不同行,我使用的是

ArrayList<Row> rows; 

問題在於一個函數,它是應該返回的一個雙[]含有值存儲在ArrayList中的特定列。我目前的函數看起來像這樣

public Double[] getByIndex(int i) 
    { 
     Double[] result = new Double[rows.size()]; 
     String temp; 
     for(int j=0;j<rows.size();j++) 
     { 
      temp =(String)rows.get(j).getAtIndex(i); //java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String 
      result[j]=Double.parseDouble(temp); 
     } 
     return result; 
    } 

這getByIndex()調用時拋出ClassCastExceptions異常。我確保我只爲那些預計會有Double值的列調用這個函數。 是否有任何其他方式來促進此對象的雙重轉換。由於這個問題,我的進度停頓了。 請幫忙。

+0

你行已經包含在您電話中的一個雙去,你想投它到一個字符串。你如何填充你的行? –

+0

謝謝大家!特別感謝@vizier的KISS兼容解決方案:) 我從來不知道StackOverflow上的響應如此之快。讓我想要在這樣一個充滿活力的社區中活躍起來。你們好棒! –

回答

4

而不是

temp =(String)rows.get(j).getAtIndex(i); //java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String 
result[j]=Double.parseDouble(temp); 

只需使用以下命令:

 result[j]=(Double)rows.get(j).getAtIndex(i); 
0

嘗試:

String.valueOf(rows.get(j).getAtIndex(i)) 

或者:(如果你的行只包含雙,但那麼你或許應該聲明它是這樣)

Double temp; 
for(int j=0;j<rows.size();j++) 
{ 
    temp =(Double)rows.get(j).getAtIndex(i); 
    result[j]=Double.parseDouble(temp); 

您excplicitly鑄造的東西爲String,當某些東西不是字符串時,轉換就會失敗(字符串在Java中是最終的)。正確的關鍵是你把什麼放在行中,它只是雙打?

0

有許多與你嘗試什麼問題。

首先,您不應該需要臨時字符串才能進入Double。這是明確的代碼味道,表明出現了問題。

從事物的外表,你應該能夠做到這一點直接投:

result[j]=(Double)rows.get(j).getAtIndex(i); 

這是@vizier取得

其次,如果你沒有希望得到的建議來自某個不是字符串的對象的字符串,您應該使用Object.toString()String.valueOf。簡單地輸入一個值,希望它是一個字符串,這幾乎不是一個好主意(除非你確定它是一個字符串)。在你的情況下,你期待雙打,所以String.valueOf(Double)將工作。

1

要多一些防彈,我會結合由esej和vizier的答案......(但只有當這不是一個性能瓶頸!)

Object temp = rows.get(j).getAtIndex(i); 
if (temp instanceof Double) { 
    result[j]=(Double)rows.get(j).getAtIndex(i); 
} else { 
    try { 
    temp = String.valueOf(rows.get(j).getAtIndex(i)); 
    result[j]= Double.parseDouble(temp); 
    } catch (NumberFormatException e) { 
    // logging and recovery code goes here, or rethrow as an exception you can handle. 
    } 
} 

如果是這種應用程序的性能瓶頸,然後通過各種手段用什麼大臣說:)

+0

Object temp =(String)rows.get(j).getAtIndex(i); 再次拋出相同的ClassCastException –

+0

是的,古斯犯了一個錯字(刪除第一行的完整「(字符串)」)。否則,我喜歡他/她的答案,因爲它包含一個try-catch。正確的解決方案可能是你的代碼中的其他地方(你填充Row類 - 並重新定義這個類,它有點奇怪,填充它完全無類型的imho。) – esej

+0

修復:)謝謝! – Gus