2016-06-17 5 views
16

मुझे System.exit(0); के साथ कोई समस्या है। मैं नीचे दिए गए कोड की कोशिश की तो उत्पादन System.exit(0); की वजह से कुछ भी नहीं था:System.exit (0) अंततः सुरक्षा प्रबंधक होने पर रोक नहीं सकता है .checkExit एक अपवाद फेंक

String number = "12345M"; 
try { 
    System.exit(0); 
} catch (Exception e) { 
    System.out.println("Exception caught"); 
} finally { 
    System.out.println("inside finally"); 
} 

लेकिन जब मैं कोड के नीचे इस की कोशिश की:

System.setSecurityManager(new SecurityManager() { 
    @Override 
    public void checkExit(int status) { 
     throw new ThreadDeath(); 
    } 
}); 

try { 
    System.exit(0); 
} finally { 
    System.out.println("I am finally block"); 
} 

उत्पादन किया गया था:

मैं अंत में कर रहा हूँ ब्लॉक

क्या कोई कृपया इस अलग व्यवहार की व्याख्या करें?

+2

पर एक नज़र System.exit() करने से रोका जाता है तो यह काम आप ऐसा नहीं की उम्मीद करनी चाहिए है करते हैं

बदलें आखिरकार बुलाए जाने से रोकें। –

उत्तर

18

क्योंकि exitThreadDeath अपवाद द्वारा रोक दिया गया (जो आपके द्वारा अपने आप को btw फेंक दिया जाना चाहिए नहीं है):

SecurityException - एक सुरक्षा प्रबंधक मौजूद है और इसके checkExit विधि निर्दिष्ट के साथ बाहर निकलने की अनुमति नहीं है, तो स्थिति।

https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit(int)

ध्यान दें कि आप एक SecurityException फेंक चाहिए बाहर निकलने जैसे को रोकने के लिए:

System.setSecurityManager(new SecurityManager() { 
    @Override 
    public void checkExit(int status) { 
     throw new SecurityException("Not allowed."); 
    } 
}); 

try { 
    System.exit(0); 
} catch(SecurityException e) { 
    System.out.println("Exit failed."); 
} finally { 
    System.out.println("I am finally block"); 
} 
System.out.println("Program still running"); 

आउटपुट:

Exit failed. 
I am finally block 
Program still running 
3

Quoting:

java.lang.SecurityManager वर्ग अनुप्रयोगों एक सुरक्षा नीति को लागू करने की अनुमति देता है। यह किसी एप्लिकेशन को संभावित रूप से असुरक्षित या संवेदनशील संचालन करने से पहले, ऑपरेशन क्या है और क्या यह एक सुरक्षा संदर्भ में प्रयास किया जा रहा है जो ऑपरेशन को करने की अनुमति देता है। आवेदन ऑपरेशन की अनुमति या अनुमति दे सकता है।

उपरोक्त कोड में चेकएक्सिट निर्धारित करता है कि ऑपरेशन को संचालित करने की अनुमति है या सामान्य रूप से काम करेगा और इस प्रकार बाहर निकलें। चूंकि एक अपवाद फेंक दिया जाता है, इस प्रकार ऑपरेशन को असुरक्षित निर्धारित किया जाता है और इसे निष्पादन से रोका जाता है।

देखें http://www.tutorialspoint.com/java/lang/system_exit.htm

4

जब आप checkExit() विधि अधिभावी बिना System.exit() फोन, JVM उस बिंदु पर रोक दिया जाता है और अंत में नहीं बुलाया जाता है।

हालांकि, जब आप checkExit() विधि को ओवरराइड करते हैं, तो अपवाद फेंक दिया जाता है और अंत में कहा जाता है।

2

System.exit(0); एक कहा जाता है, यह फोन करेगा Runtime.exit बाद में और इसमें, यह जांच करेगा कि सुरक्षा प्रबंधक संलग्न है या नहीं। यदि कोई संलग्न है तो यह चेकएक्सिट विधि निष्पादित करेगा।,

public void exit(int status) { 
    SecurityManager security = System.getSecurityManager(); 
    if (security != null) { 
     security.checkExit(status); 
    } 
    Shutdown.exit(status); 
} 

तो अपने कोड में प्रणाली वास्तव में बाहर नहीं है जब आप System.exit(0); कहते हैं क्योंकि आप SecurityManager.checkExit

Shutdown.exit(status); में एक अपवाद कभी नहीं कहा जाता है फेंक और:

Runtime.exit में कोड देखें वीएम बंद नहीं है और यह जो भी बयानों को निष्पादित करना जारी रखेगा और फिर यह मुख्य विधि के अंत तक पहुंच जाएगा और समाप्त हो जाएगा। आप इस तरह से कोड और चारों ओर खेलने

System.setSecurityManager(new SecurityManager() { 
           @Override 
           public void checkExit(int status) { 

            if(status == 0){ 
             System.out.println("Not going to finally"); 
            }else{ 
             throw new SecurityException(); 
            } 

           } 
          }); 

    try { 
     System.exit(1); 

    } catch (Exception e){ 
     e.printStackTrace(); 
    }finally { 
     System.out.println("I am finally block"); 
    } 

    System.out.println("System.exit(1) Didn't work ......"); 

} 

System.exit जावा दस्तावेज़ और Runtime.exit डॉक

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