2015-08-11 3 views
7
class TestExceptions { 

    public static void main(String[] args) throws Exception { 
     try { 
      System.out.println("try"); 
      throw new Exception(); 
     } catch(Exception e) { 
      System.out.println("catch"); 
      throw new RuntimeException(); 
     } finally { 
      System.out.println("finally"); 
     } 
    } 
} 

जब मैं कई बार ग्रहण में कोड चलाने की कोशिश करता हूं तो आउटपुट निम्न होते हैं। मुझे अब तक विश्वास था कि जब भी कोशिश/पकड़ ब्लॉक से कोड की आखिरी पंक्ति निष्पादित की जा रही है (जो वापस आ सकता है या नया अपवाद() प्रकार stmt फेंकता है), अंत में ब्लॉक निष्पादित किया जाएगा, लेकिन यहां आउटपुट अलग है हर बार? क्या कोई मेरी व्याख्या सही या गलत है तो क्या कोई स्पष्टीकरण दे सकता है?हर बार आउटपुट अलग क्यों होता है? कोशिश करें अंततः अपवाद कोड

try 
catch 
Exception in thread "main" finally 
java.lang.RuntimeException 
    at TestExceptions.main(TestExceptions.java:9) 


Exception in thread "main" try 
catch 
java.lang.RuntimeException 
    at TestExceptions.main(TestExceptions.java:9) 
finally 
+1

संबंधित: http://stackoverflow.com/questions/23588123/why-does-the-execution-order-between-the-printstacktrace-and-the-other-methods – JonK

उत्तर

9

यह स्पष्ट रूप से क्योंकि ग्रहण कंसोल में उचित तुल्यकालन के बिना error stream और output stream प्रिंट कर रहा है है। इस वजह से बहुत से लोगों ने मुद्दों को देखा है।

कमांड प्रॉम्प्ट में प्रोग्राम निष्पादित करें और आप हर बार उचित आउटपुट देखेंगे।

+0

हाँ, मैं जब मैं कमांड प्रॉम्प्ट से कई बार भाग गया तो आउटपुट से नीचे हो गया। कोशिश पकड़ अंत में TestExceptions.main (TestExceptions.java:9) ग्रहण पर धागा "मुख्य" java.lang.RuntimeException में अपवाद, त्रुटि स्ट्रीम और उत्पादन धारा async कर रहे हैं, कि कुछ नया करने की मैं आज सीखा है। लेकिन वे अभी भी एक ही कंसोल तक पहुंच रहे हैं और यहां तक ​​कि कमांड प्रॉम्प्ट भी एकल आउटपुट कंसोल तक पहुंच रहा है .. इतना बड़ा अंतर क्यों है? – Dish

0

@ कोडबेंडर से सहमत होने पर, आप सभी थ्रो अपवाद को प्रतिस्थापित कर सकते हैं और उन्हें प्रिंटस्टैकट्रेस() के साथ प्रतिस्थापित कर सकते हैं; तो अपवाद और आउट syn में मुद्रित किया जाएगा। ईजी:

public static void main(String[] args) throws Exception { 
     try { 
      System.out.println("try"); 
      throw new Exception(); 
     } catch(Exception e) { 
      System.out.println("catch"); 
      e.printStackTrace(); 
     } finally { 
      System.out.println("finally"); 
     } 
    } 
} 
+0

'प्रिंटस्टैकट्रेस' प्रिंट भी त्रुटि स्ट्रीम में प्रिंट करता है। तो कुछ भी नहीं बदला जाना चाहिए। मैं लगातार आउटपुट प्राप्त करने के लिए 'System.out' के बजाय' System.err' का उपयोग करने का सुझाव देता हूं। – talex

+0

लेकिन यह इस मामले में "मुख्य" ट्रेड के समान चलने का उपयोग करेगा। इसलिए आउट आउट क्रम में होंगे। – Kamidu

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