मैंने केवल इस प्रश्न पर ध्यान दिया है, और मैं अपना $ .02 इसमें जोड़ना चाहता हूं।
जावा के मामले में, यह वास्तव में एक विकल्प नहीं है। "अगम्य कोड" त्रुटि इस तथ्य से नहीं आती है कि जेवीएम डेवलपर्स ने डेवलपर्स को किसी भी चीज़ से बचाने या अतिरिक्त सतर्क रहने के लिए सोचा था, लेकिन जेवीएम विनिर्देश की आवश्यकताओं से।
जावा कंपाइलर और जेवीएम, दोनों का उपयोग करें जिसे "स्टैक मैप्स" कहा जाता है - स्टैक पर सभी वस्तुओं के बारे में एक निश्चित जानकारी, जैसा कि वर्तमान पद्धति के लिए आवंटित किया गया है। स्टैक के प्रत्येक और प्रत्येक स्लॉट के प्रकार को ज्ञात होना चाहिए, ताकि एक जेवीएम निर्देश दूसरे प्रकार के लिए एक प्रकार के आइटम को गलत न करे। यह एक सूचक के रूप में कभी इस्तेमाल किए जा रहे संख्यात्मक मूल्य को रोकने के लिए ज्यादातर महत्वपूर्ण है। यह संभव है कि जावा असेंबली का उपयोग करके किसी नंबर को पुश / स्टोर करने की कोशिश की जाए, लेकिन फिर ऑब्जेक्ट रेफरेंस को पॉप / लोड किया जाए। हालांकि, JVM वर्ग सत्यापन के दौरान इस कोड को अस्वीकार कर देगा, - यह तब है जब स्टैक मैप्स बनाए जा रहे हैं और स्थिरता के लिए परीक्षण किए जा रहे हैं।
स्टैक मैप्स को सत्यापित करने के लिए, VM को उन सभी कोड रास्तों से गुजरना पड़ता है जो एक विधि में मौजूद होते हैं, और यह सुनिश्चित करते हैं कि कोई भी कोड पथ कभी भी निष्पादित नहीं होगा, हर निर्देश के लिए स्टैक डेटा किसी भी पिछले कोड को धक्का देने से सहमत है। / स्टैक में संग्रहीत। तो, के सरल मामले में:
Object a;
if (something) { a = new Object(); } else { a = new String(); }
System.out.println(a);
पंक्ति 3 पर, JVM यह जाँच करेगा कि 'अगर' की दोनों शाखाएँ केवल एक में संग्रहीत की गई हैं (जो कि सिर्फ स्थानीय संस्करण # 0 है) कुछ ऐसा है जो ऑब्जेक्ट के साथ संगत है (क्योंकि यह पंक्ति 3 से कोड है और स्थानीय संस्करण # 0 का इलाज करेगा। )।
जब संकलक एक अगम्य कोड के लिए जाता है, तो यह बिल्कुल नहीं जानता कि स्टैक उस बिंदु पर क्या हो सकता है, इसलिए यह अपने राज्य को सत्यापित नहीं कर सकता है। यह उस बिंदु पर अब कोड को काफी संकलित नहीं कर सकता है, क्योंकि यह स्थानीय चर का ट्रैक भी नहीं रख सकता है, इसलिए क्लास की फाइल में इस अस्पष्टता को छोड़ने के बजाय, यह एक घातक त्रुटि पैदा करता है।
बेशक एक साधारण स्थिति if (1<2)
इसे बेवकूफ बना देगी, लेकिन यह वास्तव में मूर्खतापूर्ण नहीं है - यह इसे एक संभावित शाखा दे रहा है जिससे कोड हो सकता है, और कम से कम कंपाइलर और वीएम दोनों निर्धारित कर सकते हैं कि स्टैक आइटम का उपयोग कैसे किया जा सकता है। पर।
PS मुझे नहीं पता कि .NET इस मामले में क्या करता है, लेकिन मेरा मानना है कि यह संकलन को भी विफल कर देगा। यह आमतौर पर किसी भी मशीन कोड कंपाइलर (C, C ++, Obj-C, आदि) के लिए कोई समस्या नहीं होगी।