2008-10-09 7 views
6

मैं xml से ऑब्जेक्ट को deserializing जब क्लासकास्ट अपवाद पकड़ने की कोशिश कर रहा हूँ।मैं क्लासकास्ट अपवाद कैसे पकड़ूं?

तो,

try { 
    restoredItem = (T) decoder.readObject(); 
} catch (ClassCastException e){ 
    //don't need to crash at this point, 
    //just let the user know that a wrong file has been passed. 
} 

और फिर भी इस रूप में अपवाद पकड़ा नहीं करता है नहीं होगा मिलता है। आप क्या सुझाव देंगे?

+0

Retagged पर isAssignableFrom विधि का उपयोग करने और अधिक सामान्य अपवाद-releated टैग का उपयोग करने में सक्षम हो सकता है। –

उत्तर

8

प्रश्न में दिए गए कोड आपको एक अनचेक कास्ट चेतावनी देना चाहिए। - एक्सलिंट सुनो।

सभी संकलक टी के बारे में जानते हैं इसकी सीमाएं हैं, जो संभवतः नहीं है (स्पष्ट रूप से ऑब्जेक्ट को विस्तारित करने और शून्य प्रकार के सुपर के अलावा)। तो रनटाइम पर प्रभावी ढंग से कास्ट (ऑब्जेक्ट) है - बहुत उपयोगी नहीं है।

आप क्या कर सकते हैं पैरामीटरयुक्त प्रकार की कक्षा के उदाहरण में पास किया जाता है (माना जाता है कि यह सामान्य नहीं है)।

class MyReader<T> { 
    private final Class<T> clazz; 
    MyReader(Class<T> clazz) { 
     if (clazz == null) { 
      throw new NullPointerException(); 
     } 
     this.clazz = clazz; 
    } 
    public T restore(String from) { 
     ... 
     try { 
      restoredItem = clazz.cast(decoder.readObject()); 
      ... 
      return restoredItem; 
     } catch (ClassCastException exc) { 
      ... 
     } 
    } 
} 

या एक सामान्य विधि के रूप में:

public <T> T restore(Class<T> clazz, String from) { 
     ... 
     try { 
      restoredItem = clazz.cast(decoder.readObject()); 
      ... 
0

ठीक है, मैं instanceof ऑपरेटर का उपयोग नहीं कर सकते हैं तरीके के रूप में एक parametrized एक है:

public T restore(String from){ 
... 
restoredItem = (T) decoder.readObject(); 
... 
} 

और जावा में जेनरिक संकलन समय ही कर रहे हैं।

+0

क्या यह सुझाव नहीं देगा कि टी को कास्ट वास्तव में कॉलर द्वारा किया जाता है, विधि के अनुसार नहीं? –

+0

यकीन नहीं है कि मुझे आपकी बात काफी मिल गई है। एक त्वरित हैक के रूप में मैं पुनर्स्थापना (..) से एक ऑब्जेक्ट लौटाता हूं और एक उच्च स्तर पर जांच का उदाहरण देता हूं, इसमें कोई जेनेरिक शामिल नहीं होता है (क्योंकि वे वैसे भी मदद नहीं करते हैं)। फिर भी, यह बदसूरत है। – yanchenko

3

किसी भी ClassCastException, जब आपके टी कुछ आधार है को छोड़कर वहाँ नहीं होगा:

public class GenericsTest 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(cast(Integer.valueOf(0))); 
     System.out.println(GenericsTest.<Long> cast(Integer.valueOf(0))); 
     System.out.println(GenericsTest.<Long> cast("Hallo")); 

     System.out.println(castBaseNumber(Integer.valueOf(0))); 
     System.out.println(GenericsTest.<Long> castBaseNumber(Integer.valueOf(0))); 
     System.out.println(GenericsTest.<Long> castBaseNumber("Hallo")); 
    } 

    private static <T extends Number> T castBaseNumber(Object o) 
    { 
     T t = (T)o; 
     return t; 
    } 

    private static <T> T cast(Object o) 
    { 
     T t = (T)o; 
     return t; 
    } 
} 

उपरोक्त उदाहरण में, वहाँ हो जाएगा पहली 5 कॉल में CastCastException कास्ट और CastBaseNumber को कॉल करने के लिए नहीं। केवल 6 वें कॉल क्लासकास्ट अपवाद को फेंकता है, क्योंकि संकलक प्रभावी रूप से कास्ट() को वापस करने के लिए (ऑब्जेक्ट) ओ और कास्टबेस नम्बर() को वापस करने के लिए अनुवाद करता है (संख्या) ओ; Wenn आप

String s = GenericsTest.<Long> cast("Hallo"); 

बारे में आप एक ClassCastException मिलेगा, लेकिन नहीं कच्चे विधि whithin, लेकिन रों को काम पर।

इसलिए मुझे लगता है कि, आपका "टी" सिर्फ "टी" नहीं है, लेकिन "टी कुछ बढ़ाता है"। तो अगर आप की जांच कर सकता:

Object o = decoder.readObject(); 
if (o instanceof Something) 
    restoredItem = (T) o; 
else 
    // Error handling 

लेकिन यह अभी भी, बाद में एक त्रुटि के लिए नेतृत्व जब आप अपने वर्ग का उपयोग करेगा।

public Reader<T extends Number>{...} 

Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException 

इस मामले के लिए केवल टॉम की सलाह ही मदद कर सकती है।

0

आप instaceof उपयोग नहीं कर सकते, तो आप कक्षा

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