2015-10-27 4 views
6

में रनटाइम अपवाद फेंक दें ओसीपीजेपी 8 में मेरे अध्ययन के दौरान मुझे एक प्रश्न का सामना करना पड़ा है जिसका मेरे पास बहुत स्पष्ट उत्तर नहीं है। निम्नलिखित कोड पर विचार करें:Closable.close()

public class Animals 
{ 
class Lamb implements Closeable 
{ 
    public void close() 
    { 
     throw new RuntimeException("a"); 
    } 
} 

public static void main(String[] args) 
{ 
    new Animals().run(); 
} 

public void run() 
{ 
    try (Lamb l = new Lamb();) 
    { 
     throw new IOException(); 
    } 
    catch (Exception e) 
    { 
     throw new RuntimeException("c"); 
    } 
} 
} 

एक सवाल के लिए किताब सही जवाब के अनुसार, "कौन सा अपवाद होगा कोड फेंक?" "बिना किसी दबाए अपवाद के रनटाइम अपवाद सी" है। मैंने इस कोड को ग्रहण और system.out में चेक किया है, यह सुझाव देता है कि पुस्तक सही है। हालांकि, मैं भी कोड थोड़ा संशोधित और बस फेंक RuntimeException "सी"

System.out.println(e.getSuppressed().toString()); 

और आउटपुट मैं इस System.out से मिल गया है से पहले निम्न System.out जोड़ दिया है:

[Ljava.lang.Throwable; @ 75da931b

तो स्पष्ट रूप से वहाँ एक दबा अपवाद नहीं है। डीबग मोड में, मैंने यह भी पाया है कि यह दबाया अपवाद निकट() विधि में एक फहरा हुआ है।

दो प्रश्न: 1. कंसोल में बंद() विधि में फेंकने के अपवाद के बारे में कोई जानकारी क्यों नहीं है? 2. क्या पुस्तक द्वारा दिया गया उत्तर सही है?

+0

एक साइड नोट के रूप में, 'System.out.println (Arrays.toString (e.getSuppressed())) का उपयोग करें;' अधिक अर्थपूर्ण आउटपुट प्राप्त करने के लिए ... – Holger

उत्तर

3

दबा अपवाद (RuntimeException -एक) IOExceptioncatch में फंस गए और स्टैक ट्रेस प्रिंटआउट से खो के रूप में यह RuntimeException -सी की cause के रूप में पारित नहीं किया गया था करने के लिए जोड़ा गया है।

तो जब RuntimeException -सी main से छपा है यह IOException या दबा RuntimeException -एक का कोई जिक्र नहीं है।

और इसलिए इस पुस्तक का जवाब सही है क्योंकि एकमात्र अपवाद है कि main विधि से प्रचारित किया जाता है RuntimeException है -सी cause (IOException) के बिना, और किसी भी दबा दिया अपवाद के बिना (के रूप में यह IOException पर था)।