2

我正在尝试处理我的代码中源自单个关键点的许多 ClassCastExceptions。我将首先为这个问题提供一些背景信息

我正在从 csv 文件中读取不同类型的值。以下是包含它们的类的快照。

public class Row {
private Object[] data;

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

为了保存文件的不同行,我使用的是

ArrayList<Row> rows;

问题在于一个函数应该返回一个 Double[] 包含存储在 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 值的列调用此函数。有没有其他方法可以促进这个 Object 到 Double 的转换。由于这个问题,我的进度停滞不前。请帮忙。

4

4 回答 4

5

代替

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);
于 2012-06-04T21:42:53.917 回答
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.
  }
}

如果这是应用程序的性能瓶颈,那么一定要按照 vizier 所说的 :)

于 2012-06-04T21:51:56.457 回答
0

尝试:

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

或者:(如果您的行只包含 Double,那么您可能应该这样声明它。)

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

您正在将某些东西明确地转换为字符串,当该东西不是字符串时,转换将失败(字符串在 Java 中是最终的)。正确的关键是你把什么放到行中,它只是双打吗?

于 2012-06-04T21:42:44.557 回答
0

您正在尝试的内容存在许多问题。

首先,你不应该需要一个临时字符串来获得一个 Double。那是明确的代码气味,表明出了问题。

从外观上看,您应该可以直接进行该转换:

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

这是@vizier 提出的建议

其次,如果您确实想从某个不是字符串的对象中获取字符串,则应该使用Object.toString()or String.valueOf。简单地转换一个值以希望它是一个字符串几乎从来都不是一个好主意(除非您确定它将是一个字符串)。在你的情况下,你期待双打,所以String.valueOf(Double)会起作用。

于 2012-06-04T21:49:40.843 回答