2009-02-05 10 views
22

मैं एक जावा रूकी हूं और मैं सोच रहा था, अगर मैं निम्नलिखित ठेठ जावा कोडजावा में, "आखिरकार" ब्लॉक को कॉल करने की गारंटी है (मुख्य विधि में)?

public class MyApp { 
    public static void main(String[] args) { 
    try { 
     // do stuff 
    } catch { 
     // handle errors 
    } finally { 
     // clean up connections etc. 
    } 
    } 
} 

है JVM गारंटी नहीं है कि अंत में ब्लॉक हमेशा चलाया जाएगा करता है? यह समझने के लिए कि मैं कहां से आ रहा हूं, मुझे सी/सी ++ प्रोग्रामों में उपयोग किया जाता है जो कि यदि आप एक पूर्ण पॉइंटर को अस्वीकार करते हैं तो आप क्रैश हो सकते हैं और उसके बाद आपके पास कोई कोड नहीं चल सकता है।

लेकिन जैसा कि मैं सामान्य रूप से जावा और पूरे जीसी/प्रबंधित मेमोरी व्यवसाय को समझता हूं, वहां शून्य सूचक सूचक के रूप में ऐसी कोई चीज़ नहीं है, सब कुछ एक आकर्षक निष्पादन है, इसलिए मेरे प्रोग्राम को क्रैश करने का वास्तव में कोई तरीका नहीं है यह आखिरकार छोड़ देता है, या वहां है? उदाहरण के लिए, पायथन में, मैं आमतौर पर

try: 
    # do stuff 
except AnExceptionIKnewMightHappen: 
    # react in an appropriate way 
except: 
    # log that weird error I had not known could happen 

करते हैं और मैं अपने कोड के माध्यम से गुजर बिना किसी भी अनुप्रयोग मरने था कभी नहीं किया है।

बेशक, यदि किसी कारण से ओएस प्रक्रिया को मारता है (या अगर प्लग को खींचने की तरह पूरे सिस्टम को मारता है) तो जावा बहुत कुछ नहीं कर सकता है। इसके अलावा, PHP से मैं गैर-पकड़ने योग्य त्रुटियों को जानता हूं जिनके खिलाफ आप रक्षा नहीं कर सकते हैं, भले ही दुभाषिया अभी भी हुआ था (कम से कम यह एक उचित संदेश आउटपुट करने में सक्षम है)।

संपादित करें: बस स्पष्टता के लिए (यह वास्तव में किसी के द्वारा गलत समझा नहीं था), मुझे जोड़ने कि मैं चीजों को मेरी कोड अंदर है कि करने के लिए अंत में नजरअंदाज किया जा रहा ले जा सकता है की तलाश में गया था। तो System.exit को इंगित करना एक सहायक अनुस्मारक था, भले ही मैं नहीं देख पा रहा हूं कि मैं ऐसा कुछ क्यों करना चाहता हूं।

जेवीएम निकालना एक स्पष्ट तरीका है और मैं इसे बाहरी कारण के रूप में गिनता हूं। नोट यह इंगित करता है कि आपको जेवीएम और ऐप चलने के दौरान बाहर निकलने वाले धागे की संभावना को भी याद रखना होगा, क्योंकि यह अब भी मेरे लिए स्पष्ट प्रतीत होता है, लेकिन मैंने इसके बारे में सोचा नहीं था।

+1

जी, यह तेज़ उत्तर था। जाहिर है एक बहुत ही नोब सवाल। फिर भी धन्यवाद! –

+0

उत्तर नहीं है, यहां विवरण देखें: http://tshikatshikaaa.blogspot.nl/2012/07/about-using-systemexit-in-try-catch.html – JVerstry

उत्तर

41

मूल रूप से हाँ, सिवाय टिप्पणी listed here (जोर मेरा) के लिए:

JVM जबकि कोशिश या पकड़ कोड बाहर निकल जाता है तो निष्पादित किया जा रहा है, अंततः ब्लॉक निष्पादित नहीं हो सकता है। इसी प्रकार, अगर कोशिश या पकड़ कोड निष्पादित करना बाधित या मार दिया गया है, तो आखिरकार ब्लॉक निष्पादित नहीं हो सकता है, भले ही पूरे के रूप में एप्लिकेशन जारी रहे।

+15

ध्यान दें कि पावर कॉर्ड खींचने से आमतौर पर रोकने का एक अच्छा तरीका है "आखिरकार" चलने से भी ... –

+3

एलओएल - और यदि यह लैपटॉप है, तो लैपटॉप में बैटरी उसी पल में मर जाती है: डी –

+5

आकाश स्क्रैपर की शीर्ष कहानी से लैपटॉप को छोड़ना भी आखिरकार ब्लॉक को रोकता है * और * शट डाउन हुक !! –

0

एआरएम, हाँ :) क्या आपका कोड कैच में प्रवेश करता है या नहीं, आखिरकार दौड़ जाएगा। यह कोड डालने के लिए एक अच्छी जगह है जो कोशिश के बाद साफ हो जाती है।

जाहिर है अगर आप JVM :) तोड़ने यह नहीं चलेगा

0

हां, आखिरकार ब्लॉक हमेशा चलाया जाएगा, जब तक कि JVM का क्रैश न हो (बहुत दुर्लभ, लेकिन ऐसा हो सकता है)।

12

यह गारंटी नहीं है:

public class Main { 
    public static void main(String args[]) { 
     try { 
      System.out.println("try"); 
      System.exit(0); 
     } catch (Exception e) { 
      System.out.println("exception"); 
     } finally { 
      System.out.println("finally"); 
     } 
    } 
} 

भागो कि।

+0

यह सुनिश्चित नहीं है कि यह कैसे प्रासंगिक है "इसलिए मेरे प्रोग्राम को क्रैश करने का वास्तव में कोई तरीका नहीं है जो इसे अंत में छोड़ सकता है, या वहां है?" स्पष्ट रूप से यदि आप JVM को छोड़ देते हैं, बॉक्स को पावरसायकल करते हैं या मॉनीटर को शूट करते हैं तो अंततः नहीं चलेंगे।अप-वोटों पर आश्चर्यचकित, लेकिन फिर शायद मैं सिर्फ ईर्ष्यावान हूं :) –

+0

यह counterexample द्वारा सरल सबूत है। जाहिर है यह गारंटी नहीं है। यह आपके लिए महत्वपूर्ण हो सकता है या नहीं भी हो सकता है। और यदि यह "साफ" निकास पर होता है, तो मैं आपको गारंटी देता हूं कि यह वास्तविक क्रैश पर बेहतर नहीं है। – cletus

+0

मुझे लगता है कि यह कहना सुरक्षित है कि System.exit() एक विशेष मामला –

8

एक शब्द में, हाँ।

अंत में जावा में ब्लॉक में कोड हमेशा निष्पादित करता है जब तक कि:

  • JVM कोशिश या कैच ब्लॉक
  • धागा कोड चल रहा बाधित या कोशिश या पकड़ ब्लॉक के दौरान मार दिया जाता है के दौरान बाहर निकालता है

(से: http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html)

तो, जब तक आप स्पष्ट System.exit (पूर्णांक), फोन या प्रक्रिया को मारने या बाह्य सूत्र, आप इस पर भरोसा कर सकते हैं।

3

बिल्कुल, अंततः ब्लॉक हर बार चल जाएगा। किसी JVM क्रैश या निकास() फ़ंक्शन को कॉल करने के मामले में छोड़कर। मेरे पास कोड था जहां जावा एप्लिकेशन ने जेएनआई देशी कोड को कॉल किया था जो segfaulted था। परिणामी दुर्घटना ने जेवीएम को मार दिया, और आखिरकार दौड़ने से रोका।

2

क्रिस कैमरून सही है। लेकिन आम तौर पर finally -block निष्पादित हो जाता है। जावा में नल पॉइंटर डेरफेरेस मौजूद है:

try { 
    List<Object> x = null; 
    x.get(1); //throws the unchecked NullPointerException 
} finally { 
    //will be executed 
} 

आखिरकार-ब्लॉक निष्पादित हो जाता है।

+0

यह दिलचस्प है, मुझे यह नहीं पता था। हालांकि यह क्लासिक सी सेगफॉल्ट से अभी भी काफी अलग है। –

1

हां, जेवीएम हमेशा इसे निष्पादित करता है। Gaurranteed।

बेशक ... यदि JVM स्वयं मर जाता है (उदाहरण: System.exit()), तो यह किसी भी चीज की गारंटी नहीं है। लेकिन जेवीएम मरना एक जावा-मुद्दा नहीं है।

+2

यह सही नहीं है। ** Thread.stop() ** ** अंततः ** ब्लॉक को रोक सकता है जबकि JVM अभी भी चल रहा है। –

0

अंततः अवरोध निष्पादित नहीं किया गया है, या तो JVM क्रैश, या system.exit()।

+0

मुझे लगता है कि आखिरकार ब्लॉक को कॉल किया जाता है जब 'System.exit() 'का आह्वान किया जाता है। –

0

यह बहुत स्पष्ट लगता है कि कुछ भी अधिक जेएमवी छोड़ने के बाद चलाएगा, या उस मारे गए थ्रेड में कोड चलाएगा। स्पष्ट। इसलिए, जब JVM चल रहा है, तो चलने वाला प्रत्येक कोड चलाएगा, और एक जेवीएम के बाद या मृत थ्रेड के अंदर, कुछ भी नहीं किसी भी प्रकार का कोड चलाएगा। तो, रोकने के लिए कोई रास्ता नहीं है, लेकिन अगर अंत में खंड की आवश्यकता है, तो इसे रखें।

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