2010-03-10 15 views
8

हम जानते हैं कि कोई फर्क नहीं पड़ता कि क्या एक अपवाद फेंका जाता है, या पकड़ लिया और संभाला यह, अंत में ब्लॉक निष्पादित हो जाएगा, तो मुझे लगता है कि वहाँ किसी भी संभावना है कि अंत में ब्लॉक निष्पादित नहीं होगा उत्सुक था।क्या कोई संभावना है कि आखिरकार ब्लॉक निष्पादित नहीं हो सकता है?

और अगर System.exit() या तो कोशिश या पकड़ में कहा जाता है, तो भी अंत में कहा जाता हो जाता होगा?

+8

यदि आप अपने पीसी के प्लग को खींचते हैं, तो आखिरकार ब्लॉक निष्पादित नहीं होगा। – Fortega

उत्तर

21

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

स्रोत: java.sun.com: Java Tutorial: The finally Block

+1

वहां "मई" शब्द का ध्यान रखें। – Joset

3

जावा प्रलेखन में:

http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html

यह अंत में बहुत अच्छी तरह से बताते हैं।

वे ध्यान देते हैं कि यदि JVM बाहर निकलता है, तो आखिरकार ब्लॉक नहीं कहा जाएगा। या यदि कोड का ब्लॉक चल रहा एक धागा मारे गए, अंत में ब्लॉक नहीं कहा जाएगा। अन्य सभी मामलों में यह होगा।

2

एक बात मैं की अभी सोच सकते हैं इस बात की संभावना है कि आपकी ऐप में आगे कोई कोड क्रियान्वित किया जा सकता है जो मामले में एक OutOfMemoryError है।

+0

यहां तक ​​कि आउटऑफमेमरी एरर के मामले में, अंत में ब्लॉक निष्पादित किया जाएगा। अंततः ब्लॉक को निष्पादित करने का निष्पादन निश्चित रूप से आउटऑफमेमरी एरर का कारण बन सकता है, लेकिन यह भी हो सकता है, भले ही प्रयास ब्लॉक सफल हो गया हो। – jarnbjo

6

System.exit() को क्रियान्वित करने से एक finally ब्लॉक नहीं कर पाएगा।

0

तो कुछ जावा मूल निवासी इंटरफ़ेस विधि segfaults (जावा के बाहर एक पुस्तकालय समारोह लेकिन कहा जाता है वहाँ दुर्घटनाओं से) एक अंत में विधि भी क्योंकि पूरे JVM बंद हो जाता है नहीं बुलाया जाएगा।

JVM अपने आप में

त्रुटियाँ भी एक दुर्घटना में परिणाम और निरंतर निष्पादन से सब कुछ को रोकने के।

1

System.exit (1); सामान्य जावा कार्यक्रम के प्रवाह में अपवाद की घटना से प्रभावित हुए बिना,

BEFORE 
2
try { 
    System.out.println("BEFORE"); 
    System.exit(0); 
    System.out.println("AFTER"); 
} finally { 
    System.out.println("FINALLY"); 
} 

यह आप उत्पादन दे देंगे उपयोग कर सकते हैं। यदि अंतिम खंड से पहले निष्पादन प्रवाह रोक दिया जाता है तो आखिरकार ब्लॉक निष्पादित नहीं किया जाएगा।

हम अंततः ब्लॉक और प्रोग्राम के निष्पादन प्रवाह को रोकने से पहले System.exit(1); का उपयोग कर सकते हैं।

0

अंत में कोशिश पकड़ अपवाद ब्लॉक में खंड हमेशा कार्यान्वित: आप

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