2013-02-27 9 views
11

मेरी समस्या का मूल यह है कि मेरे पास एक तरीका है जो जेडीबीसी प्रश्नों को संभालता है और क्वेरी के बाद सभी कनेक्शन जारी करता है। एक "परिणामसेट" कॉलिंग विधि पर वापस भेज दिया जाता है।क्लासकास्ट अपवाद: java.lang.Object java.lang.Integer

मुझे पता चला है कि मैं परिणामसेट को सीधे कॉलिंग विधि पर पास नहीं कर सकता, क्योंकि परिणामसेट बंद होने के साथ, इसका उपयोग करने के किसी भी प्रयास को पहले से ही बंद त्रुटि मिलती है।

तो संसाधनों को बंद करने से पहले, मैं परिणामसेट के माध्यम से लूप करता हूं और इसे एक ऐरेलिस्ट में संग्रहीत करता हूं।

क्योंकि विधि किसी भी प्रश्न को संभालती है, मुझे नहीं पता कि किस तरह के प्रकार लौटाए जा रहे हैं। इसलिए ArrayList जेनेरिक एस स्टोर करता है।

यह एक तालिका में एक फ़ील्ड को छोड़कर काम करता है .. एक डेटाबेस में, यह एक पूर्णांक [] फ़ील्ड है।

जो मैं वहां से बाहर निकलता हूं वह एक जेडीबीसी 4 एरे ऑब्जेक्ट है, और मेरे पास एररेलिस्ट में स्टोर करने के लिए एक इंटीजर [] को प्राप्त करने का समय है। मुझे इसे इंटीजर होने की आवश्यकता है []।

यह वही है जो मेरे पास है ... यह बहुत निराशाजनक बैंजक्सक्सिंग के बाद है।

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

     ... 
    } 

और मैं मिल:

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

मुझे लगता है कि पैरामीटर 'नया इंटीजर [0]' होना चाहिए - आपको वास्तव में पारित वस्तु में किसी भी स्थान की आवश्यकता नहीं है, इसका उपयोग केवल कक्षा की जानकारी प्राप्त करने के लिए किया जाता है, लेकिन आपको इसे तुरंत चालू करना होगा। – AgilePro

+0

@AgilePro: यदि पास सरणी काफी बड़ी है (कम से कम comps.size() तत्व), पारित सरणी भर जाएगी और toArray विधि द्वारा लौटा दी जाएगी। सरणी को काफी बड़ा बनाना उसी प्रकार के अतिरिक्त सरणी को बनाएगा जो बनाएगा। – jarnbjo

संबंधित मुद्दे