2010-08-18 7 views
13

मेरे पास एक सिंगल थ्रेडेड ऐप है जो किसी समस्या होने पर डॉस त्रुटिलेवल को गैर-शून्य पर सेट करना चाहिए। क्या RuntimeException फेंकना या System.exit (nonzero) का उपयोग करना बेहतर है? मुझे स्टैक ट्रेस की आवश्यकता नहीं है, और मुझे उम्मीद है कि इस ऐप को विस्तार/पुन: उपयोग नहीं किया जाएगा। इन दो विकल्पों के बीच मतभेद क्या हैं?System.exit (num) या मुख्य से RuntimeException फेंक दें?

+1

आपने अपने स्वयं के प्रश्न का उत्तर दिया है। यदि आपको एक डॉस त्रुटि कोड सेट करना है तो आपको System.exit (कोड) का उपयोग करना होगा। आप इसे अपवाद के साथ नहीं कर सकते हैं। – EJP

+0

मुख्य सेट से एक रनटाइम अपवाद को 3 से घटाकर, हालांकि मुझे यकीन नहीं है कि यह सभी परिस्थितियों में क्यों है या नहीं। – VarV

उत्तर

9

अपवाद फेंक न दें जब तक कि आपके पास वास्तव में असाधारण स्थिति न हो। System.exit(int) इस कारण से ठीक है। इसका इस्तेमाल करें।

संपादित करें: मुझे लगता है कि मैंने आपके प्रश्न को गलत तरीके से पढ़ा होगा। मैंने सोचा था कि आप पूछ रहे थे, जब आप सामान्य रूप से जेवीएम से बाहर निकलना चाहते हैं लेकिन संकेत देते हैं कि कुछ सही नहीं हुआ है, चाहे कोई अपवाद फेंकना बेहतर है या System.exit का उपयोग करना बेहतर है।

हालांकि, यदि समस्या उत्पन्न होती है तो ऐसा कुछ ऐसा होता है जो पहले से जावा अपवाद द्वारा इंगित किया गया है, तो बस यह अपवाद अनचाहे होने दें। आपको अपवाद को पकड़ने और System.exit पर कॉल करने की आवश्यकता नहीं है।

यदि आपके पास कोई विकल्प है या आप System.exit पर कॉल करना चाहते हैं, तो इस बारे में सोचें कि त्रुटि स्थिति ऐसी चीज है जो कुछ जावा कोड द्वारा संभाला जा सकता है जो आपकी विधि को कॉल करता है। अगर त्रुटि main विधि में सीधे होती है, तो शायद अपवाद को संभालने के लिए कभी भी कॉलर नहीं होगा, इसलिए आपको शायद System.exit पर कॉल करना चाहिए। अन्यथा, आमतौर पर अपवाद फेंकना सबसे अच्छा होता है - लेकिन RuntimeException नहीं, आपको शायद एक अपवाद प्रकार का उपयोग करना चाहिए जो आपके सामने आने वाली त्रुटि का उचित रूप से प्रतिनिधित्व करता है। यदि आवश्यक हो तो RuntimeException का अपना उप-वर्ग लिखें।

+0

फिर मुख्य सेट से अपवाद को अपवाद क्यों किया जाता है? ऐसा लगता है कि वे किसी कारण से हैं। – VarV

+2

जब कोई एप्लिकेशन सफलतापूर्वक समाप्त नहीं होता है, तो उसका रिटर्न कोड 0 के अलावा कुछ और होना चाहिए। इसलिए यदि कोई अनचाहे अपवाद है तो JVM स्वचालित रूप से रिटर्न कोड 1 पर सेट कर देगा, ताकि माता-पिता प्रक्रिया को पता चल सके कि आपका प्रोग्राम समाप्त हो गया है त्रुटि (और न सिर्फ इसलिए कि यह काम खत्म कर दिया)। –

-4

System.exit() अनुशंसित नहीं है। यह जेवीएम बंद करता है।

+0

जेवीएम को बंद करना इस मामले में ठीक है, अगर कोई त्रुटि हो तो आवेदन किया जाता है। – VarV

+0

न तो जेनेरिक रनटाइम अपवाद मेरी राय –

+0

या तो system.exit (int) या नई रनटाइम अपवाद को फेंकने की सलाह दी जाती है, जिसे बाद में सामान्य रंटीम अपवाद माना जाता है? – VarV

6

आम तौर पर इस स्थिति में मैं अपने मुख्य विधि में संभवतः System.exit पर कॉल करके सभी अपवादों को संभालेगा। यह आपको त्रुटि कोड के साथ समाप्त करने की आपकी आवश्यकता को पूरा करते हुए, असाधारण स्थितियों को संभालने के लिए कहां/चाहे/कैसे लचीलापन देता है। विशेष रूप से, यह आपको रिटर्न कोड और उपयोगकर्ता के लिए उत्पन्न होने वाले किसी अन्य आउटपुट पर नियंत्रण देता है (त्रुटि संदेश, स्टैक ट्रेस इत्यादि)। यदि आप मुख्य में अपवाद फेंकते हैं (या अपवाद से बचने दें), तो आप उस नियंत्रण को खो देते हैं।

संक्षेप में, केवल अपने उच्चतम स्तर के अपवाद संचालक में System.exit फोन:

static public void main() { 
    try { 
     runMyApp(); 
    } catch (Exception e) { 
     System.exit(1); 
    } 
} 
+0

मैं शायद इस समाधान के साथ जाऊंगा, लेकिन मैं कारणों से मछली पकड़ रहा था कि System.exit को मुख्य से अपवाद फेंकने पर प्राथमिकता क्यों दी जाती है। – VarV

3

एक अपवाद उत्पन्न बाहर स्टैक ट्रेस प्रिंट होगा, और अगर आपको लगता है कि जरूरत नहीं है, आप का उपयोग shoul System.exit ।

बाहर निकलने पर आप उपयोगकर्ता को Sytem.out के साथ सूचित कर सकते हैं (मुझे लगता है कि ऐप केवल कमांडलाइन वातावरण में चल रहा है)।

आपको एक अलग लॉग में त्रुटियों को लॉगिंग करने में सभी त्रुटियों को पकड़ने पर विचार करना चाहिए, यह सुनिश्चित करता है कि जब आप टर्मिनल बंद करते हैं तो स्टैकट्रैक हमेशा के लिए खो नहीं जाता है। इस उद्देश्य के लिए log4j पर एक नज़र डालें, इसका उपयोग करना वास्तव में आसान है।

+0

हां, यह केवल कमांडलाइन वातावरण में है। मुझे स्टैक ट्रेस की आवश्यकता नहीं है क्योंकि यह हमारी निर्माण प्रक्रिया में एक स्वचालित कदम है जो या तो गुजरता है या विफल रहता है, इसलिए log4j भी अधिक है। – VarV

+0

फिर system.exit समाधान के लिए जाएं। यह एक अच्छा समाधान है, खासकर यदि आप बाद में रिटर्न कोड की जांच करते हैं। इस तरह आप संकेत दे सकते हैं कि अलग-अलग कोडों का उपयोग करके क्या गलत हुआ, या बस System.exit (-1) के लिए जाएं – Jes

2

एपीपी को सिस्टम.एक्सिट का उपयोग करना चाहिए। यह कॉलिंग पर्यावरण (स्क्रिप्ट) के साथ इसका इंटरफ़ेस है। पाठ्यक्रम के किसी भी आंतरिक घटक अपवाद का उपयोग करना चाहिए। जब आप इसे एक साथ रखा यह हो सकता है दोनों of'em:

Application.main(...) { 
    parse(args); 
    check(...); 
    try { 
    MyObject o = ...; 
    o.doMyStuff(); 
    } catch (Exception e) { 
    System.err.println("Oops, something went wrong!"); // by example, or use a logging framework! // anyway in a shell app System.in/out/err IS my interface with the outworld 
    System.exit(ERROR_CODE); 
    } 
    System.out.println("Worked!"); 
} 
0

System.exit (संख्या) एक अच्छा विकल्प है, इसके बंद JVM के रूप में नहीं है, के साथ साथ यहां तक ​​कि इसे चलाने के फ्लॉप अंत में अगर आप के बाद ब्लॉक पकड़ ब्लॉक

रनिंग रनटाइम अपवाद भी विकल्प का सबसे अच्छा नहीं हो सकता है, जैसा कि पहले बताया गया है कि ऐप विशिष्ट अपवाद मेरी राय में एक बेहतर विकल्प हो सकता है। -Manish

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