web-dev-qa-db-ja.com

ClassCastException:Java.lang.ObjectをJava.lang.Integerにキャストできません

私の問題の根本は、JDBCクエリを処理し、クエリ後にすべての接続を解放するメソッドがあることです。 「ResultSet」が呼び出し元のメソッドに返されます。

ResultSetを閉じた状態で使用しようとすると、Already Closedエラーが発生するため、ResultSetを呼び出し元のメソッドに単純に戻すことはできないことがわかりました。

したがって、リソースを閉じる前に、ResultSetをループして、ArrayListに格納します。

このメソッドはすべてのクエリを処理するため、どのような種類が返されるのかわかりません。したがって、ArrayListはジェネリックを格納します。

これは、1つのテーブルの1つのフィールド、つまり1つのデータベースのInteger []フィールドを除いて機能します。

そこから得られるのはJDBC4Arrayオブジェクトであり、ArrayListに格納するためにそれをInteger []に取得するのに時間がかかります。 Integer []である必要があります。

これは私が今持っているものです...それはそれをたくさんの欲求不満のbanjaxxingの後です。

ResultSetをループしている間、接続が閉じられる前に、次のようにします。

            // For every row in the ResultSet
            while (rs.next()) {
                // Initialize a ITILRow for this ResultSet row
                ITILRow row = new ITILRow();

                // For each column in this row, add that object to the ITILRow
                for (int colNum=1; colNum<=numCols; colNum++) {
                    Object o = rs.getObject(colNum);

                    // JDBC4Array is a real pain in the butt
                    ArrayList<Integer> tmpList = new ArrayList<Integer>();
                    if (o != null) {
                        if (o.getClass().getSimpleName().endsWith("Array")) {
                            // At least at this time, these Arrays are all Integer[]
                            Array a = (Array) o;
                            Integer[] ints = (Integer[]) a.getArray();
                            for (Integer i : ints) {
                                tmpList.add(i);
                            }
                            o = tmpList;
                        }
                    }

                    row.add(o);
                }

                // Add the ITILRow to allRows
                allRows.add(row);
            }

次に、呼び出しメソッドで...

    for (ITILRow row : allRows) {
        ...
        ArrayList comps = (ArrayList) row.getObject(5);
        Integer[] argh = (Integer[]) ((ArrayList<Integer>) comps).toArray();

        ...
    }

そして私は得る:

Java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

助けていただければ幸いです。私は私の脳をこれの結び目に縛り付けました。

ありがとう、

13
Lurk21

List#toArray()Object配列を返します。代わりに List#toArray(T[]) を使用してください。

Integer[] arg = (Integer[]) comps.toArray(new Integer[comps.size()]);
34
PermGenError