2013-02-27 14 views
11

Źródłem mojego problemu jest to, że mam metodę, która obsługuje zapytania JDBC i uwalnia wszystkie połączenia po zapytaniu. "ResultSet" jest przekazywany do metody wywołującej.ClassCastException: java.lang.Object nie może być rzutowany na java.lang.Integer

Zauważyłem, że nie mogę po prostu przekazać ResultSet z powrotem do metody wywołującej, ponieważ przy zamkniętym ResultSet, wszelkie próby jego użycia powodują błąd już zamknięty.

Więc zanim zamknę zasoby, przechodzę przez ResultSet i zapisuję go w tablicy ArrayList.

Ponieważ metoda obsługuje dowolne zapytanie, nie wiem, jakiego rodzaju typy są zwracane. Dlatego ArrayList przechowuje ogólne s.

Działa to z wyjątkiem jednego pola w jednej tabeli .. w jednej bazie danych, czyli w polu Integer [].

Co mogę uzyskać z obiektu JDBC4Array? Potrzebuję tego, aby być Integer [].

To jest to, co mam teraz ... To po wielu sfrustrowanych boksach.

Podczas zapętlenie poprzez ResultSet, zanim połączenie zostanie zamknięte, to zrobić:

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

Następnie w metodzie wywołującej ...

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

     ... 
    } 

I otrzymujemy:

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

Pomoc byłaby doceniana. Włączyłem mój mózg w węzeł na ten temat.

Dzięki,

Odpowiedz

32

List#toArray() zwraca Object tablicę. Zamiast tego użyj List#toArray(T[]).

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

Holy smokees you were fast. Dzięki, że to zrobili. Yay! Idę dalej! Dziekuję Dziekuję Dziękuję. – Lurk21

+2

Myślę, że parametr powinien być "nowa liczba całkowita [0]" - w rzeczywistości nie potrzebujesz żadnego miejsca w obiekcie przekazanym, służy tylko do uzyskania informacji o klasie, ale musisz go utworzyć. – AgilePro

+0

@AgilePro: Jeśli przekazana tablica jest wystarczająco duża (przynajmniej elementy comps.size()), przekazana tablica zostanie wypełniona i zwrócona przez metodę toArray. Zwiększenie wystarczającej ilości tablic uniemożliwi utworzenie dodatkowej tablicy tego samego typu. – jarnbjo

Powiązane problemy