2009-12-24 22 views
25

निम्नलिखित कोड नमूना दिया गया है:,क्या जावा अनंत लूप को पहचानता है?

public class WeirdStuff { 

    public static int doSomething() { 
     while(true); 
    } 

    public static void main(String[] args) { 
     doSomething(); 
    } 
} 

यह एक वैध जावा प्रोग्राम है, हालांकि विधि DoSomething() किसी पूर्णांक लौटना चाहिए, लेकिन कभी नहीं करता है। यदि आप इसे चलाते हैं, तो यह एक अनंत लूप में समाप्त हो जाएगा। यदि आप एक अलग चर (जैसे बूलियन बूल = सत्य) में थोड़ी देर के लूप का तर्क डालते हैं तो संकलक आपको इस विधि में एक int वापस करने के लिए कहेंगे।

तो मेरा सवाल यह है: क्या यह कहीं जावा विनिर्देश में है और क्या ऐसी स्थिति है जहां यह व्यवहार उपयोगी हो सकता है?

+0

आपको 'सत्य (सत्य) के बाद 'वापसी 0;' (या समतुल्य) की आवश्यकता नहीं होगी; ', बस कंपाइलर को खुश करने के लिए? मुझे पता है कि मैंने जावा शिकायत की है कि विधियां पहले सही प्रकार को वापस नहीं करती हैं। ... कहा जा रहा है, मैं पूरी तरह से एक संकलन कार्यक्रम होने के नाते देख सकते हैं। –

+0

बहुत रोचक ... मुझे आश्चर्य हुआ कि यह वास्तव में संकलित है। – cjstehno

उत्तर

19

के रूप में यह इस पर नहीं बल्कि स्पष्ट है मैं सिर्फ Java Language Specification बोली होगा,: "। पहुंच योग्य"

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

...

कुछ समय बयान सामान्य रूप से आईएफएफ पूरा कर सकते हैं निम्न में से कम से कम एक सत्य है:

  • जबकि बयान पहुंचा जा सकता है और हालत अभिव्यक्ति एक स्थिर नहीं है मूल्य सही के साथ अभिव्यक्ति।
  • एक पहुंच योग्य ब्रेक स्टेटमेंट है जो समय बयान से बाहर निकलता है।

...

एक अरिक्त ब्लॉक में हर अन्य बयान एस कि एक स्विच ब्लॉक पहुंचा जा सकता है iff बयान एस पूर्ववर्ती सामान्य रूप से पूरा कर सकते हैं नहीं है।

और फिर this को उपरोक्त परिभाषाओं लागू होते हैं: एक विधि तो हर वापसी कथन (§14.17) ने अपने शरीर में एक अभिव्यक्ति होनी चाहिए, एक वापसी प्रकार के लिए घोषित किया जाता है

हैं। एक संकलन-समय त्रुटि तब होती है जब विधि का शरीर सामान्य रूप से पूरा हो सकता है (§14.1)।

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

ध्यान दें कि एक घोषित रिटर्न प्रकार के लिए एक विधि के लिए संभव है और अभी तक कोई रिटर्न स्टेटमेंट नहीं है।

class DizzyDean { 
    int pitch() { throw new RuntimeException("90 mph?!"); } 
} 
+0

जेएलएस! \ O / – Bombe

7

यदि आप पूछ रहे हैं कि अनंत लूप उपयोगी हो सकते हैं, तो जवाब हाँ है। ऐसी कई स्थितियां हैं जहां आप हमेशा कुछ चलाना चाहते हैं, हालांकि लूप आमतौर पर किसी बिंदु पर समाप्त हो जाएगा।

आपके प्रश्न के अनुसार: "जब जावा एक लूप अनंत होगा तो जावा पहचान सकता है?" जवाब यह है कि कंप्यूटर के लिए एक एल्गोरिदम होना असंभव है यह निर्धारित करने के लिए कि कोई प्रोग्राम हमेशा के लिए चलाएगा या नहीं। इसके बारे में पढ़ें: Halting Problem

थोड़ा और पढ़ना, आपका प्रश्न यह भी पूछ रहा है कि क्यों करना कुछ() फ़ंक्शन शिकायत नहीं करता है कि यह एक int वापस नहीं कर रहा है।

दिलचस्प बात यह है कि निम्न स्रोत संकलित नहीं होता है।

public class test { 
    public static int doSomething() {     
    //while(true); 
    boolean test=true; 
    while(test){ 


    } 
    } 
    public static void main(String[] args) {    
    doSomething();  
    } 
} 

यह मेरे लिए इंगित करता है कि, के रूप में हॉल्टिंग समस्या पर विकि पृष्ठ पता चलता है, यह असंभव है निर्धारित करने के लिए करता है, तो हर समस्या को समाप्त कर देगा एक एल्गोरिथ्म होने के लिए वहाँ के लिए है, लेकिन यह मतलब नहीं है कि किसी को नहीं जोड़ा गया है साधारण मामला:

while(true); 

जावा स्पेक में। मेरा उदाहरण ऊपर थोड़ा जटिल है, इसलिए जावा को इसे अनंत लूप के रूप में याद नहीं किया जा सकता है। वास्तव में, यह एक अजीब बढ़त का मामला है, लेकिन चीजों को संकलित करने के लिए बस वहां है। शायद कोई अन्य संयोजनों का प्रयास करेगा।

संपादित करें: पहुंचने योग्य कोड के साथ कोई समस्या नहीं।

import java.util.*; 

public class test { 
    public static int doSomething() {     
    //while(true); 
    while(true){ 
    System.out.println("Hello"); 
    } 
    } 
    public static void main(String[] args) {    
    doSomething();  
    } 
} 

उपर्युक्त काम, तो जबकि (सत्य); संकलक द्वारा पहुंचने योग्य के रूप में अनदेखा नहीं किया जा रहा है, अन्यथा यह एक संकलन समय त्रुटि फेंक देगा!

+2

आपका उत्तर भ्रामक है। एक कंप्यूटर प्रोग्राम के लिए यह असंभव है कि यह मनमाने ढंग से प्रोग्राम रोकता है या नहीं, लेकिन यह जांचना असंभव नहीं है कि "विशिष्ट कार्यक्रम" रुक गए हैं या नहीं। निश्चित रूप से, तथ्य यह है कि 'जबकि (सत्य); '' ब्रेक' या 'गोटो 'कथन के बिना कंपाइलर द्वारा एक अनंत लूप की जांच की जा सकती है। –

+0

हां, मैंने इसे ऊपर सही किया। – Alex

+0

बूलियन परीक्षण = सत्य; जबकि (परीक्षण) { } आवश्यक रूप से एक अनंत लूप नहीं है। एक और धागा 'परीक्षण' के मूल्य को बदल सकता है। –

1

हां, आप कुछ थ्रेड में इन 'अनंत' लूप देख सकते हैं, उदाहरण के लिए सर्वर थ्रेड्स जो इनकमिंग संदेशों के लिए एक निश्चित पोर्ट पर सुनते हैं।

0

सवाल फिर से पढाना के बाद ....

जावा समझता है, जबकि (सही); वास्तव में कभी पूरा नहीं हो सकता है, यह पूरी तरह से निम्नलिखित कोड का पता नहीं लगाता है।

boolean moo = true; 
while (moo); 

क्या यह उपयोगी है? संदिग्ध।

+0

और वह "वास्तव में क्या कर रहा है"? –

+0

यह एक अनंत लूप आवश्यक नहीं है। एक और धागा झूठ को 'मू' सेट कर सकता था। –

13

जावा विनिर्देश Unreachable statements नामक अवधारणा को परिभाषित करता है। आपको अपने कोड में एक पहुंचने योग्य कथन नहीं होने की अनुमति है (यह एक संकलित समय त्रुटि है)। एक while(true); कथन परिभाषा के अनुसार निम्नलिखित बयानों को पहुंचने योग्य बनाता है। जावा में while(true); कथन के बाद आपको return कथन देने की भी अनुमति नहीं है। ध्यान दें कि Halting problem सामान्य मामले में अपरिहार्य है, अप्राप्य वक्तव्य की परिभाषा केवल रोकना से अधिक सख्त है।यह का निर्णय ले रहा है बहुत विशिष्ट मामलों जहां एक कार्यक्रम निश्चित रूप से रुकता नहीं है। कंपाइलर सैद्धांतिक रूप से सभी अनंत लूप और पहुंचने योग्य बयान का पता लगाने में सक्षम नहीं है लेकिन इसे spec में परिभाषित विशिष्ट मामलों का पता लगाना है।

+0

लेकिन, यह संकलित करता है। इसके अलावा: जबकि (सत्य) {// कोड} भी उस इंटी को वापस किए बिना संकलित करता है! – Alex

+3

'जबकि (सत्य) 'पहुंच योग्य नहीं है (स्पष्ट रूप से!)। कोई भी कथन जो 'सत्य (सत्य)' का पालन करेगा, पहुंच योग्य नहीं है। –

+0

पावेल: ठीक है। यही मेरा मतलब है, ज़ाहिर है। –

1

तो मेरे सवाल है: जावा विनिर्देश

कार्यक्रम में यह कहीं है कानूनी विनिर्देश के अनुसार जावा है। जेएलएस (और जावा कंपाइलर) यह मानता है कि विधि वापस नहीं आ सकती है, और इसलिए return कथन आवश्यक नहीं है। दरअसल, यदि आपने लूप के बाद return कथन जोड़ा है, तो जावा कंपाइलर आपको संकलन त्रुटि देगा क्योंकि रिटर्न स्टेटमेंट पहुंच योग्य कोड होगा।

और क्या ऐसी स्थिति है जहां यह व्यवहार उपयोगी हो सकता है?

मुझे ऐसा नहीं लगता है, संभवतः अस्पष्ट इकाई परीक्षणों को छोड़कर।

मैं कभी-कभी उन तरीकों को लिखता हूं जो कभी वापस नहीं आते हैं (सामान्य रूप से), लेकिन वर्तमान थ्रेड को एक अनियंत्रित अनंत व्यस्त-लूप में डालने से शायद ही कोई अर्थ हो।

0

आप एक सामान्य इंटरफ़ेस ऐसी है कि, भले ही विधि एक सार्थक वापसी मान के साथ बाहर निकल सकते हैं को लागू करने जा सकता है, अपने विशेष कार्यान्वयन एक उपयोगी अनंत लूप (उदाहरण के लिए, एक नेटवर्क सर्वर) जो एक स्थिति है जहाँ है कभी नहीं है इसे बाहर निकलना चाहिए, यानि मूल्य को वापस करने वाली किसी भी कार्रवाई को ट्रिगर करना।

इसके अलावा, boolean x = true; while (x); की तरह कोड के बारे में, इस x पर एक final संशोधक दिया संकलित कर देगा। मुझे ऑफहैंड नहीं पता है, लेकिन मुझे लगता है कि यह उचित सरल निरंतर अभिव्यक्ति विश्लेषण की जावा की पसंद है (जिसे इस पर निर्भर कार्यक्रमों के अस्वीकृति के कारण, सीधे परिभाषित करने की आवश्यकता है, यह भाषा परिभाषा का हिस्सा है)।

0

नहीं पहुंचा जा सकता स्टेटमेंट के बारे में कुछ नोट::

java2 specs में 'नहीं पहुंचा जा सकता बयान' का वर्णन पाया जा सकता है यहाँ एक उदाहरण है। विशेष रूप से दिलचस्प निम्नलिखित वाक्य:

की विशेष उपचार जबकि, कर के अलावा, और बयान जिसका हालत अभिव्यक्ति निरंतर मूल्य सही है के लिए , अभिव्यक्ति की मूल्यों को ध्यान में रखा नहीं कर रहे हैं प्रवाह विश्लेषण में

तो, while (true); अनंत लूप से बाहर निकलना स्पष्ट रूप से संभव नहीं है। हालांकि, दो और विकल्प थे: change cached values या सीधे क्लास फ़ाइल या जेवीएम ऑपरेटिंग मेमोरी स्पेस में हैक करें।

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