2013-02-27 7 views
11

Der Grund meines Problems ist, dass ich eine Methode habe, die JDBC-Abfragen verarbeitet und alle Verbindungen nach der Abfrage freigibt. Ein "ResultSet" wird an die aufrufende Methode zurückgegeben.ClassCastException: java.lang.Object kann nicht in java.lang.Integer umgewandelt werden

Ich habe festgestellt, dass ich das ResultSet nicht einfach an die aufrufende Methode übergeben kann, denn mit dem geschlossenen ResultSet erhalten alle Versuche, es zu verwenden, einen Fehler bereits geschlossen.

Bevor ich also die Ressourcen schließe, durchlaufe ich das ResultSet und speichere es in einer ArrayList.

Da die Methode jede Abfrage behandelt, weiß ich nicht, welche Arten von Typen zurückgegeben werden. Daher speichert die ArrayList generische s.

Dies funktioniert bis auf ein Feld in einer Tabelle .. in einer Datenbank, das ist ein Integer [] -Feld.

Was ich da raus bekomme, ist ein JDBC4Array-Objekt, und ich habe eine Menge Zeit, um es zu einem Integer [] für die Speicherung in der ArrayList zu bekommen. Ich brauche es ein Integer [].

Das ist, was ich gerade habe ... Es ist nach vielen frustrierten Banjaxxing es.

Während durch das ResultSet Looping, bevor die Verbindung geschlossen wird, ich dies tun:

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

Dann wird in der Rufmethode ...

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

     ... 
    } 

Und ich bekomme:

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

Hilfe wäre willkommen. Ich habe mein Gehirn in einen Knoten verknotet.

Danke,

Antwort

32

List#toArray() gibt ein Object Array. Verwenden Sie stattdessen List#toArray(T[]).

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

Heilige raucht du warst schnell. Danke, dass es getan hat. Yay! Ich komme wieder voran !! Danke danke danke. – Lurk21

+2

Ich denke, der Parameter sollte 'new Integer [0]' sein - Sie brauchen eigentlich keinen Platz im übergebenen Objekt, es wird nur verwendet, um die Klasseninformationen zu erhalten, aber Sie müssen es instanziieren. – AgilePro

+0

@AgilePro: Wenn das übergebene Array groß genug ist (mindestens comps.size() - Elemente), wird das übergebene Array gefüllt und von der toArray-Methode zurückgegeben. Wenn das Array groß genug ist, wird verhindert, dass ein zusätzliches Array desselben Typs erstellt wird. – jarnbjo

Verwandte Themen