2013-02-27 18 views
11

Sorunumun kökü, JDBC sorgularını işleyen ve tüm bağlantıları sorgudan sonra serbest bırakan bir yönteme sahip olduğum. Bir "ResultSet" çağrı yöntemine geri iletilir.ClassCastException: java.lang.Object, java.lang.Integer için atanamaz.

ResultSet'i arama yöntemine geri döndüremediğimi öğrendim, çünkü ResultSet kapalıyken, kullanmaya yönelik tüm girişimler Zaten Kapalı bir hata alıyor.

Kaynakları kapatmadan önce, ResultSet'in içinden geçip bir ArrayList'de saklarım.

Yöntem herhangi bir sorguyu işlediğinden, ne tür türlerin döndüğünü bilmiyorum. Bu nedenle ArrayList jenerik s depolar.

Bu, bir tabloda bir alan dışında çalışır. Bir veritabanında, bir Tamsayı [] alanı.

Dışarıdan çıkardığım bir JDBC4Array nesnesi ve ArrayList'te saklamak için bir Tamsayıya [] ulaşmanın zamanının bir zamanı var. Tamsayı olmak için ona ihtiyacım var [].

Şu anda sahip olduğum şey bu ... Çok fazla sinir bozucu banjaxxing sonra.

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

     ... 
    } 

... çağıran yönteminde, Sonra

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

Ve olsun:

bağlantısı kapatılmadan önce, ResultSet döngü ederken, bunu

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

Yardım memnuniyetle karşılanacaktır. Beynimi bunun üzerinde bir düğüm haline getirdim.

sayesinde

cevap

32

List#toArray() bir Object dizi döndürür. Bunun yerine List#toArray(T[]) kullanın.

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

Kutsal dumanlar çok hızlılardı. Teşekkürler bunu yaptı. Yuppi! Tekrar ilerliyorum! Teşekkürler teşekkürler teşekkürler. – Lurk21

+2

Parametrenin 'new Integer [0]' olması gerektiğini düşünüyorum - gerçekten, içinde geçirilen nesnede herhangi bir alana gerek duymuyorsunuz, sadece sınıf bilgisini almak için kullanılıyor, ancak bunu başlatmalısınız. – AgilePro

+0

@AgilePro: Geçirilen dizi yeterince büyükse (en az comps.size() öğeleri), geçirilen dizi doldurulacak ve toArray yöntemi tarafından döndürülecektir. Diziyi yeterince büyük yapmak, aynı türden ek bir dizi oluşturulmasını engeller. – jarnbjo

İlgili konular