2

単一の重要なポイントから発生した、コード内の多くの ClassCastExceptions を処理しようとしています。この質問の背景情報を提供することから始めます

csv ファイルからさまざまな種類の値を読み取っています。以下は、それらを保持するクラスのスナップショットです。

public class Row {
private Object[] data;

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

ファイルのさまざまな行を保持するために、私は

ArrayList<Row> rows;

問題は、 ArrayList に格納されている特定の列の値を含む Double[] を返すはずの関数にあります。私の現在の機能は次のようになります

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

あなたが試みていることには多くの問題があります。

何よりもまず、Double に到達するために一時的な文字列は必要ありません。これは間違いなくコードの匂いであり、何かが間違っていることを示しています。

物事の外観から、そのキャストを直接行うことができるはずです:

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

これは@vizierが行った提案です

次に、文字列ではないオブジェクトから文字列を取得Object.toString()たい場合は、 または のいずれかを使用する必要がありますString.valueOf。文字列であることを期待して単に値をキャストすることは、ほとんど良い考えではありません (文字列になることが確実でない限り)。あなたの場合、ダブルスを期待しているので、うまくいくString.valueOf(Double)でしょう。

于 2012-06-04T21:49:40.843 に答える
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);

何かを String に明示的にキャストしています。その何かが String でない場合、キャストは失敗します (Java では String が final です)。正しいことの鍵は、列に何を入れるかです。それはダブルスだけですか?

于 2012-06-04T21:42:44.557 に答える