2013-02-27 14 views
11

私の問題の根本は、JDBCクエリを処理し、クエリ後にすべての接続を解放するメソッドがあることです。 「ResultSet」は、呼び出し元のメソッドに返されます。ClassCastException:java.lang.Objectにjava.lang.Integerにキャストできません

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

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

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

これは、1つのテーブル内の1つのフィールドを除き、1つのデータベース内のInteger []フィールドです。

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

これは私が今持っているものです...それは多くの挫折したbanjaxxingの後です。

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

     ... 
    } 

...呼び出し方法では、次に

  // 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); 
      } 

そして私が手::

接続が閉じられる前に、ResultSetのをループしながら、私はこれを行う

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

助けていただければ幸いです。私は私の脳をこの結び目に結びつけた。

おかげで、

答えて

32

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

Integer[] arg = (Integer[]) comps.toArray(new Integer[comps.size()]); 
+2

あなたは速かったです。ありがとうございました。わーい!私は再び前進しています!ありがとう、ありがとう、ありがとう。 – Lurk21

+2

私はパラメータが 'new Integer [0]'であるべきだと思います。渡されたオブジェクトには実際にスペースを必要とせず、クラス情報を取得するためにのみ使用されますが、インスタンス化する必要があります。 – AgilePro

+0

@AgilePro:渡された配列が十分に大きい(少なくともcomps.size()要素)場合は、渡された配列が塗りつぶされ、toArrayメソッドによって返されます。配列を十分に大きくすると、同じ型の追加の配列が作成されなくなります。 – jarnbjo

関連する問題