2010-01-15 32 views
11

सी/सी ++ मुख्य() के संबंध में हमेशा एक पूर्णांक (शून्य को सफलतापूर्वक इंगित करने के लिए शून्य और शून्य विफलता इंगित करने के लिए) को वापस करना होगा। मैं इसे समझ सकता हूं क्योंकि प्रोग्राम चलाया जाता है, यह एक प्रक्रिया बन जाता है और प्रत्येक प्रक्रिया में बाहर निकलने की स्थिति होनी चाहिए, जिसे हम echo $ करके प्राप्त करते हैं? प्रक्रिया खत्म हो जाने के बाद खोल से।मुख्य कार्य कुछ भी वापस नहीं करता है। क्यूं कर?

अब मुझे समझ में नहीं आता कि मुख्य विधि जावा में कुछ भी क्यों नहीं लौटाती है? क्या इस तथ्य के साथ कुछ करने के लिए कुछ भी है कि कार्यक्रम JVM पर चलाया गया है और JVM प्रक्रिया निकास स्थिति को वापस करने के लिए reposnsible है?

कृपया स्पष्ट करें।

धन्यवाद,
रोजर

उत्तर

14

मुख्य विधि एक भी लड़ी जावा आवेदन समाप्त हो जाता है की , आवेदन बाहर निकलें कोड 0. साथ समाप्त आप शायद एक त्रुटि इंगित करने के लिए एक और बाहर निकलने के कोड की जरूरत है, होगा, आप रख सकते हैं

System.exit(yourNumberHere); 

कोड में कहीं भी (विशेष रूप से मुख्य विधि के बाहर)।

यह बहु-थ्रेडेड अनुप्रयोगों के लिए अलग है, जहां आपको के अंदर से kill -9 के अंदर से JVM को रोकने के लिए उपयोग करना होगा।

public static void main(String args[]) { 
    Thread iWillSurvive = new Thread(new Runnable() { 
    public void run() { 
     while(true) { 
     // heat the CPU 
     } 
    } 
    }); 
    iWillSurvive.start(); 
} 

टिप्पणी:: बिल्कुल, एक धागा जब यह विधि चलाए जाने के दौरान समाप्त कर देगा (या

यहाँ एक त्वरित उदाहरण है जहां मुख्य की समाप्ति आवेदन (एक ठेठ सेवा या डेमॉन व्यवहार) बंद नहीं होता है मुख्य धागे के मामले में मुख्य विधि) समाप्त हो जाती है। और इस मामले में, जब सभी धागे समाप्त हो जाते हैं, तो JVM निकास कोड 0 के साथ समाप्त हो जाएगा (जो हमें प्रारंभिक प्रश्न पर वापस लाता है)। आशा है कि अब सब खुश हैं।

+0

आपका कहना है कि मेरे पास मेरे प्रोग्राम में System.exit() नहीं है, तो JVM इसे 0 के साथ जोड़ देगा। और यदि मेरे प्रोग्राम में शून्य-शून्य मान के साथ एक स्पष्ट कॉल है, तो इसे बाहर निकलने के रूप में उपयोग किया जाएगा स्थिति ? – gameover

+0

मुख्य विधि समाप्त होने पर जावा प्रक्रिया _not_ अनिवार्य रूप से समाप्त हो जाती है, इसे मुख्य विधि से प्रक्रिया से बाहर निकलने के लिए प्रक्रिया को वापस करने के लिए अनुचित (kai1968 बिंदुओं के रूप में) बनाना। – jarnbjo

+0

अभी भी गलत है। एक बहुप्रचारित जावा एप्लिकेशन स्टॉप बनाने के लिए मार या System.exit जैसे टूल का उपयोग करना आवश्यक नहीं है। संकेत: यहां तक ​​कि सबसे सरल "हैलो वर्ल्ड" जावा एप्लिकेशन मल्टीलिथ्रेड किया गया है (जावा वीएम विभिन्न प्रबंधन मुद्दों के लिए अपने धागे शुरू करता है) और यह मुख्य विधि होने पर निकलता है। – jarnbjo

7

जावा उस उद्देश्य के लिए System.exit(int) है।

असल में, जावा प्रोग्राम मुख्य विधि के अंत तक पहुंचने पर निकास कोड 0 से बाहर निकल जाएगा (लगभग; यह स्विंग और थ्रेडिंग के साथ वीडर हो जाता है, लेकिन यह पर्याप्त होना चाहिए)।

यदि आप कहीं भी (कहीं भी, वास्तव में) या Runtime.getRuntime().exit() पर System.exit() कॉल पर कॉल करते हैं, तो प्रोग्राम तुरंत और समय से समाप्त होता है।

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

+0

हम प्रत्येक जावा प्रोग्राम के अंत में नहीं लिखते हैं, क्या हम? – gameover

+0

यदि आप असामान्य रूप से वापस नहीं लौटना चाहते हैं, नहीं। निहित निकास कोड सामान्य रूप से '0' है। – Joey

+0

आपका कहना है कि मेरे पास मेरे प्रोग्राम में System.exit() नहीं है, तो JVM इसे 0 के साथ जोड़ देगा। और यदि मेरे प्रोग्राम में गैर-शून्य मान के साथ एक स्पष्ट कॉल है, तो इसे बाहर निकलने के रूप में उपयोग किया जाएगा स्थिति ? – codaddict

0

संभवतः ऐसा इसलिए हो सकता है क्योंकि System.exit(int exitCode) कोई मूल्य नहीं लौटा।

+0

मैंने मौजूदा पोस्ट को उत्तर के रूप में नहीं देखा, इसलिए मैंने पोस्ट को एक प्रश्न से अधिक जवाब देने के लिए संपादित किया। –

16

डिज़ाइन किया गया जब बहु-थ्रेडिंग पहले से ही एक आम बात थी, जावा ने इस विचार के लिए "अलविदा" कहा था कि जब 'मुख्य' कार्यक्रम पूरा हो जाता है। यही कारण है कि कोई वापसी मूल्य नहीं है। जैसा कि अन्य ने कहा था कि जब आप रिटर्न कोड से बाहर निकलना चाहते हैं तो System.exit का उपयोग करें।

+0

यह संक्षेप में बहुत अधिक है। – McDowell

+0

+1 महान स्पष्टीकरण :) – atv

4

एक छोटी सी तुच्छ चीज़ - सी ++ में, आप मुख्य रूप से कुछ भी वापस करने की जरूरत नहीं:

int main() { 
} 

एक पूरी तरह से कानूनी सी ++ प्रोग्राम है - यह काम करता है के रूप में यदि आप था:

return 0; 

के रूप में मुख्य में अंतिम बयान।

+0

मैं यह कहने के लिए यहां आया था। यह हमेशा मुझे आश्चर्य देता है कि मानक के लिए आपको इस मामले में शून्य वापस करने की आवश्यकता नहीं है, और वास्तव में आपको इसे इस तरह घोषित करने की अनुमति नहीं है। लेकिन इस तरह यह – jcoder

0

मुझे संदेह है कि सी/सी ++ रिटर्निंग इंट का कारण है क्योंकि यह उन भाषाओं में फ़ंक्शन/विधि/प्रोग्राम सफलता/विफलता को इंगित करने के लिए सम्मेलन है।

जावा में अपवादों की शुरूआत के साथ, सफलता के लिए शून्य और विफलता के लिए गैर-शून्य मानों के बजाय, यह असफलताओं के लिए अपवाद पदानुक्रम का उपयोग करता है, और सफलताएं तब होती थी जब कोई अपवाद नहीं फेंक दिया गया था, इस प्रकार एक को वापस करने की आवश्यकता को समाप्त कर दिया गया मूल्य।

+0

काम करता है इसके अलावा 'मुख्य()' से अपवाद फेंकना उपयोगी नहीं होगा, और केवल आउटपुट को रिटर्न कोड होना चाहिए। तथ्य यह है कि सी एक प्रोग्राम में जावा अपवादों का समर्थन नहीं करता है और जावा प्रोग्राम में जावा करता है यह इस बात को प्रभावित नहीं करता है कि यह ऑपरेटिंग सिस्टम के साथ कैसे इंटरैक्ट करता है। –

0

अधिकांश कार्यक्रम जो मैं इन दिनों लिखता हूं उनमें कुछ प्रकार का यूजर इंटरफेस होता है और थोड़ा सा वे उपयोगी रूप से वापस आ सकते हैं, और यहां तक ​​कि कम संभावना है कि किसी भी स्थिति को स्थिति कोड की आवश्यकता होगी।

तो सभी कार्यक्रमों को एक लौटने के लिए मजबूर क्यों करें? जैसा कि अन्य ने कहा है, आप एक स्टेटस कोड वापस कर सकते हैं जो आप चाहते हैं ...

+0

प्रोग्राम कोड को वापस करने के लिए प्रोग्राम को मजबूर करना क्या है? –

1

निकास मूल्य बैश स्क्रिप्ट या कमांड लाइन ऑपरेशंस जैसे स्क्रिप्टिंग के लिए उपयोगी है। इसलिए इन मामलों में System.exit() का उपयोग करें।

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