2012-01-04 28 views
6

में Sytem.exit (0) पर कॉल के बाद कोड कैसे चलाएं मेरे पास अल्फा, बीटा, गामा और तीन वर्गों में से प्रत्येक तीन वर्गों में main विधि है।अंततः

दोनों अल्फा और बीटा वर्गों है, उनके main विधि के अंदर, एक try...catch...finally ब्लॉक की तरह:

public class alpha{ 

    public static void main(String[] args){ 
     try{ 
      Do something; 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
     finally{ 
      System.exit(0); 
     } 
    } 
} 


public class beta{ 

    public static void main(String[] args){ 
     try{ 
      Do something; 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
     finally{ 
      System.exit(0); 
     } 
    } 
} 

अब गामा कक्षा में मैं अल्फा और बीटा वर्गों के मुख्य तरीके फोन लगातार की तरह चलाने के लिए

नीचे
public gamma{ 

    public static void main(String[] args) { 
     try { 
      alpha.main(arg); 
      beta.main(arg1); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

समस्या यह है कि कोड beta.main(arg1) अल्फा वर्ग के finally ब्लॉक के अंदर System.exit(0) के कारण कभी नहीं पहुंचा है। चूंकि अल्फा और बीटा स्टैंडअलोन अनुप्रयोग हैं, जब वे अलग से निष्पादित होते हैं तो उन्हें प्रोग्राम के अंत में सेवा समाप्त करनी चाहिए। तो अब अल्फा और बीटा कक्षाओं की वास्तविक कार्यक्षमता को बदले बिना beta.main(arg1) लाइन तक पहुंचने का कोई तरीका है।

कृपया मुझे बताएं कि आपको और विवरण की आवश्यकता है या नहीं। अग्रिम धन्यवाद ...

+1

[रोकथाम एपीआई से System.exit()] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/5401281/preventing-system -एक्सिट-से-एपीआई) – Mat

उत्तर

4

ऐसे मामले में, बंद हुक इस्तेमाल किया जा सकता:

public class Gamma{ 

    public static void main(String[] args) { 
     try { 
     Thread hook = new Thread() { public void run() { Beta.main(args); } }; 
      hook.setDaemon(true); 
      Runtime.getRuntime().addShutdownHook(hook); 
      Alpha.main(args); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

अच्छा। मैंने निरंतर तंत्र के रूप में शटडाउन हुक का उपयोग करने के बावजूद कभी नहीं किया था। –

+0

ग्रेट उत्तर .. धन्यवाद बहुत सारे Vlad .... :-) – coolgokul

+0

आपका स्वागत है) – Vlad

2

(आदर्श रूप में, कुछ भी नहीं है कि एक मॉड्यूल के सार्वजनिक एपीआई कभी भी कुछ भी है कि exit कॉल करना चाहिए का हिस्सा है, और एक वर्ग के main विधि बस एक छोटा सा शिम कि कुछ और है कि करता है invokes होना चाहिए उचित बाहर निकलने के कोड के उत्पादन से पूर्व असली काम करते हैं।)

कहा, यदि आप System.exit रोकना चाहते हैं, तो आप एक SecurityManager कि SecurityException या Error रों में System.exit के लिए कॉल धर्मान्तरित रजिस्टर कर सकते हैं।

System.exit:

फेंकता

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

कुछ

तरह
System.setSecurityManager(new SecurityManager() { 
    @Override 
    public void checkExit(int exitCode) throws SecurityException { 
    throw new SecurityException("stop that"); 
    } 
}); 

तो विधि है जो मुख्य तरीके बुला रहा है बस पकड़ने और दबाने कि SecurityException कर सकते हैं। आप अपना खुद का ExitCalledError बनाकर और इसे फेंक कर इसे और अधिक दबाने के द्वारा इसे और अधिक मजबूत बना सकते हैं।

मुझे यूनिट-टेस्ट धावकों को सफलतापूर्वक रिपोर्टिंग सफलता से रिपोर्ट करने के लिए यह बहुत उपयोगी लगता है जब परीक्षण धावक शून्य निकास कोड के साथ परीक्षण के तहत कोड द्वारा exit एड होता है।

+0

एचएम। मैं यह तय नहीं कर सकता कि मैं इसके बारे में क्या सोचता हूं - मुझे सुरक्षा प्रबंधक को गैर-सुरक्षा चीजें करने के लिए उपयोग करने से नफरत है, लेकिन यह एक तरह का सुरुचिपूर्ण हैक है। –

+1

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

+0

ठीक है, और मैंने इसे ऊपर उठाया। अभी भी यह तय नहीं किया है कि मैं इसके बारे में क्या सोचता हूं। –

1

वास्तव में, सिस्टम.एक्सिट() कॉल से छुटकारा पाने का एकमात्र समाधान है। यही कारण है कि System.exit() बुरा है। उन्हें बदलने का एक अच्छा तरीका अपवाद फेंकना है - आप सिस्टम में अपवाद हैंडलर जोड़ सकते हैं (उन्हें प्रत्येक अपवाद पथ के लिए जोड़ने के लिए थ्रेड ग्रुप में जोड़ने में देखें) और फिर तय करें कि आप क्या करना चाहते हैं।

0

System.exit(0) वर्तमान में चल रहे जावा वर्चुअल मशीन को समाप्त करता है। यह वीएम पर सभी एप्लिकेशन बंद करता है, न केवल उस एप्लिकेशन को जो System.exit(0) पर कॉल करता है।आपको अपनी कार्यक्षमता के लिए वैकल्पिक सोचने की जरूरत है। इसके बारे में यहां एक लिंक है। System.exit usage

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