2010-12-23 15 views
59

मेरे पास निम्न स्थिति है।क्या घोषणा को फेंकने के बिना अपवाद फेंकने का कोई तरीका है?

मेरे पास एक जावा क्लास है जो किसी अन्य बेस क्लास से प्राप्त होती है और एक विधि को ओवरराइड करती है। आधार विधि अपवाद नहीं फेंकती है और इस प्रकार throws ... घोषणा नहीं है।

अब अपने ही विधि अपवाद फेंक में सक्षम होना चाहिए, लेकिन मैं या तो

  • को choise है अपवाद
  • जोड़े निगल एक घोषणा फेंकता

दोनों एक क्योंकि पहली संतोषजनक नहीं कोई चुपचाप अपवाद को अनदेखा कर देगा (ठीक है, मैं कुछ लॉगिंग कर सकता हूं) और दूसरा अलग-अलग विधि शीर्षकों के कारण संकलक त्रुटियों को उत्पन्न करेगा।

public class ChildClass extends BaseClass { 

     @Override 
     public void SomeMethod() { 
      throw new Exception("Something went wrong"); 
     } 
} 

उत्तर

76

यदि आप वास्तव में चाहते हैं तो आप उन्हें घोषित किए बिना अनचेक अपवाद फेंक सकते हैं। अनचेक अपवाद RuntimeException का विस्तार करते हैं। Error का विस्तार करने वाले थ्रोबल भी अनचेक किए गए हैं, लेकिन केवल वास्तविक समस्याओं (जैसे अमान्य बाइटकोड) के लिए उपयोग किया जाना चाहिए।

एक विशिष्ट मामले के रूप में, जावा 8 ने को लपेटने और पुनर्स्थापित करने के लिए UncheckedIOException जोड़ा।

+1

वर्क्स महान, मैं एक RuntimeException rethrow क्योंकि अपवाद किसी अन्य विधि से आता है, लेकिन यह बहुत अच्छा काम करता है, धन्यवाद। –

3

आप एक अनचेक अपवाद क्यों नहीं फेंकते? इसे घोषित नहीं किया जाना है।

दो विकल्प एक अनियंत्रित एक के साथ एक जाँच अपवाद के साथ

  • रैप कर रहे हैं।
  • संकलक को यह बताने न दें कि आप एक चेक अपवाद फेंक रहे हैं उदा। । Thread.currentThread stop() (ई);
  • जावा 6 में, यदि आप final हैं तो आप अपवाद को फिर से हटा सकते हैं और संकलक यह पता लगा सकता है कि आपने कौन से चेक अपवादों को पकड़ा होगा।
  • जावा 7 में, यदि आप प्रभावी रूप से अंतिम हैं तो आप अपवाद को फिर से चला सकते हैं, यानी आप इसे कोड में नहीं बदलते हैं।

बाद में जब आप कोड में चेक अपवाद फेंक रहे हैं और इसे अपने कॉलिंग कोड में पकड़ रहे हैं तो बाद में अधिक उपयोगी है, लेकिन इसमें परतों को अपवाद के बारे में कुछ भी पता नहीं है।

+0

-1 बहिष्कृत कार्यों का सुझाव देने के लिए – OrangeDog

+0

दूसरी विधि भी interessting है। लेकिन फिलहाल, अपवाद लपेटना वास्तव में मुझे चाहिए। –

+0

http://download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – OrangeDog

18

एक तीसरा विकल्प अपवाद जाँच (बस स्टैंडर्ड एपीआई ही कभी कभी करना है की तरह) से बाहर निकल और में जाँच अपवाद रैप करने के लिए है RuntimeException एक:

throw new RuntimeException(originalException); 

आप चाहते हो सकता है एक अधिक विशिष्ट उपयोग करने के लिए RuntimeException का उप-वर्ग।

0

आप अपने तरीके से ओवरराइड में प्रयास-पकड़ ब्लॉक के साथ अपवाद पकड़ सकते हैं। तो आपको थ्रो-स्टेटमेंट घोषित करने की आवश्यकता नहीं है।

+1

सुनिश्चित करें, लेकिन फिर मैं अपवाद को निगलूंगा, जो कि मैं जो हासिल करना चाहता हूं उसके बिल्कुल विपरीत है;) –

1

यहाँ जांचे हुए अपवादों में अवरोध डालने और उन्हें एक अनियंत्रित अपवाद में लपेटने के लिए एक उदाहरण है:

public void someMethod() { 
    try { 
     doEvil(); 
    } 
    catch (IOException e) 
    { 
     throw new RuntimeException(e); 
    } 
} 
0

आप किसी भी अपवाद RuntimeException या RuntimeException ही

या

एक try- का उपयोग से प्राप्त उपयोग कर सकते हैं अपवाद फेंकने कोड के लिए ब्लॉक और वहाँ संभाल

7

मैं सिर्फ एक विकल्प के जवाब जोड़ने करना चाहते हैं, विशुद्ध रूप से के रूप में एक FYI करें:

हाँ, वहाँ एक रास्ता, throws घोषणा जोड़ने sun.misc.Unsafe वर्ग का उपयोग करके बिना एक जाँच अपवाद फेंकने के लिए है। यह निम्नलिखित ब्लॉग पोस्ट में वर्णित है:

Throw a checked exception from a method without declaring it

नमूना कोड:

public void someMethod() { 
    //throw a checked exception without adding a "throws" 
    getUnsafe().throwException(new IOException()); 
} 

private Unsafe getUnsafe() { 
    try { 
    Field field = Unsafe.class.getDeclaredField("theUnsafe"); 
    field.setAccessible(true); 
    return (Unsafe) field.get(null); 
    } catch (Exception e) { 
    throw new RuntimeException(e); 
    } 
} 

बहरहाल, यह अनुशंसित नहीं है। कुछ अन्य उत्तरों में उल्लिखित एक अनचेक अपवाद में लपेटना बेहतर है।

जावा असुरक्षित पैकेज

getUnsafe().throwException(new IOException()); 

:

class Utils 
{ 
    @SuppressWarnings("unchecked") 
    private static <T extends Throwable> void throwException(Throwable exception, Object dummy) throws T 
    { 
     throw (T) exception; 
    } 

    public static void throwException(Throwable exception) 
    { 
     Utils.<RuntimeException>throwException(exception, null); 
    } 
} 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Utils.throwException(new Exception("This is an exception!")); 
    } 
} 
+2

एक कारण है कि वे उस वर्ग को 'असुरक्षित' कहते हैं। – OrangeDog

35

यहाँ एक चाल है यह विधि चेक अपवाद फेंकता है, लेकिन आपके कोड को पकड़ने या इसे फिर से चलाने के लिए मजबूर नहीं किया गया है। रनटाइम अपवाद की तरह।

+0

मुझे आश्चर्य है कि यह कैसे काम करता है? मैं कुछ शोध करूँगा, लेकिन क्या आपके पास कोई संसाधन है, जो मेरी मदद कर सकता है? :-) – holmicz

+0

टी रनटाइम अपवाद के रूप में अनुमानित है। यहां उत्तर दिया गया http://stackoverflow.com/questions/41380656/how-java-e-extends-throwable-become-unchecked-exception और यहां http://stackoverflow.com/questions/31316581/a-peculiar-feature-of -एसेप्शन-टाइप-इनफरेंस-इन-जावा -8 – seenimurugan

+0

बहुत बढ़िया चाल! यह चाल लैम्बडा अभिव्यक्ति/ब्लॉक पर भी लागू हो सकती है, ताकि किसी भी 'फेंकता' घोषणाओं के बिना एसएएम इंटरफेस में चेक-अपवाद विधि को असाइन करने की अनुमति मिल सके। – JasonMing

1

हाँ वहाँ एक कारण है कि लेकिन यह सब पर अनुशंसित नहीं है कि आप उपयोग कर सकते हैं:

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