अंतिम चर असाइनमेंट त्रुटि

मुझे नहीं पता कि यह एक मूर्खतापूर्ण सवाल है या नहीं, लेकिन कृपया इसका जवाब देने की कोशिश करें।

public static void main(String[] args){
    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    x=2;
}

मेरे पास एक अंतिम चर x है।

अब x को मान देने के लिए I का एक स्टेटमेंट है, जो इसे असाइन करता है और प्रोग्राम से बाहर निकलता है।

अब अंतिम विवरण कभी नहीं आता है और इस प्रकार इस कार्यक्रम को तार्किक रूप से संकलित करना चाहिए।

x का मान कथन के आधार पर मान 1 या 2 होगा। यदि 'अगर' सही है, तो अंतिम कथन तक नहीं पहुँचा जा सकता है और यदि यह गलत है तो 'x = 1' कथन कभी नहीं पहुँचता।

तो यह मुझे 'स्थानीय' चर की एक प्रारंभिक त्रुटि क्यों दे रहा है?

संपादित करें:

हाँ, मुझे स्पष्ट रूप से पता है कि एक अंतिम विवरण केवल एक बार सौंपा जा सकता है।

मेरी शंका यह थी कि निष्पादन के दौरान उन बयानों में से केवल एक ही पहुंचेगा ताकि इसे इस तरह से देखा जा सके कि कार्यक्रम में केवल एक असाइनमेंट स्टेटमेंट होगा।

1
जावा में निश्चित असाइनमेंट के बारे में बात करने वाली टिप्पणी की जाँच करें
जोड़ा लेखक Rupesh, स्रोत

9 उत्तर

Final is Final 

एक बार जब आप की घोषणा की और सौंपा, आप इसे फिर से असाइन नहीं कर सकते

और अंतिम असाइनमेंट एक संकलित समय की जांच है। फिर भी आप फ़ंक्शन से बाहर निकल रहे हैं, फिर भी यह अपना कर्तव्य करेगा :)।

2
जोड़ा
एक्स = 2; एक असाइनमेंट स्टेटमेंट सही है ?? यहां संभावना एक और शर्त है और वहां असाइन करें
जोड़ा लेखक ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, स्रोत
@LuigiEdlCarno बिल्कुल जवाब मैं देख रहा था। धन्यवाद।
जोड़ा लेखक drarkayl, स्रोत
लेकिन उन बयानों में से केवल एक ही पहुंचता है जब निष्पादन होता है
जोड़ा लेखक drarkayl, स्रोत
हाँ, लेकिन वास्तव में इसे फिर से असाइन नहीं किया गया। यह केवल एक बार कार्यक्रम के दौरान सौंपा गया है।
जोड़ा लेखक drarkayl, स्रोत
@drarkayl Corrent, "... जब निष्पादन होता है" , लेकिन यह एक संकलन समय त्रुटि है, और चूंकि आपका System.exit (0); कॉल नहीं करता है; निम्नलिखित एक <�कोड> रिटर्न </कोड> है, संकलक मानता है कि यदि बाद में भी निष्पादित किया जाएगा।
जोड़ा लेखक LuigiEdlCarno, स्रोत
Final is Final 

एक बार जब आप की घोषणा की और सौंपा, आप इसे फिर से असाइन नहीं कर सकते

और अंतिम असाइनमेंट एक संकलित समय की जांच है। फिर भी आप फ़ंक्शन से बाहर निकल रहे हैं, फिर भी यह अपना कर्तव्य करेगा :)।

2
जोड़ा
एक्स = 2; एक असाइनमेंट स्टेटमेंट सही है ?? यहां संभावना एक और शर्त है और वहां असाइन करें
जोड़ा लेखक ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, स्रोत
@LuigiEdlCarno बिल्कुल जवाब मैं देख रहा था। धन्यवाद।
जोड़ा लेखक drarkayl, स्रोत
लेकिन उन बयानों में से केवल एक ही पहुंचता है जब निष्पादन होता है
जोड़ा लेखक drarkayl, स्रोत
हाँ, लेकिन वास्तव में इसे फिर से असाइन नहीं किया गया। यह केवल एक बार कार्यक्रम के दौरान सौंपा गया है।
जोड़ा लेखक drarkayl, स्रोत
@drarkayl Corrent, "... जब निष्पादन होता है" , लेकिन यह एक संकलन समय त्रुटि है, और चूंकि आपका System.exit (0); कॉल नहीं करता है; निम्नलिखित एक <�कोड> रिटर्न </कोड> है, संकलक मानता है कि यदि बाद में भी निष्पादित किया जाएगा।
जोड़ा लेखक LuigiEdlCarno, स्रोत

x का मान यदि 1 या 2 के आधार पर होगा। अगर is अगर ’है   सत्य अंतिम कथन तक नहीं पहुँचा गया है और यदि यह 'x = 1' गलत है   बयान कभी नहीं पहुंचा।

यह सच नहीं है, क्योंकि आपके पास if के बाद और नहीं है।

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

जहां तक ​​अंतिम चर का संबंध है, यह नहीं हो सकता है दो बार सौंपा

नीचे दिया गया कोड त्रुटि के बिना काम करेगा, चूंकि i == 0 या तो true या false , और x हो सकता है। केवल एक बार सौंपा जाता है

    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    else {
        x=2;
    }
1
जोड़ा
हाँ अब मैं समझ गया। धन्यवाद।
जोड़ा लेखक drarkayl, स्रोत
संपादित प्रश्न पढ़ें।
जोड़ा लेखक drarkayl, स्रोत
उत्तर के लिए धन्यवाद, मुझे आपकी बात मिल गई, लेकिन यदि आपको निष्पादन की धारा दिखाई देती है, तो इसे दो बार निर्दिष्ट नहीं करना चाहिए।
जोड़ा लेखक drarkayl, स्रोत
आप कहते हैं कि x = 1 और फिर x = 2 इसलिए x दो बार सौंपा जा रहा है
जोड़ा लेखक sanbhat, स्रोत
@drarkayl System.exit को कोड समाप्ति के रूप में नहीं माना जाता है ... इसकी वापसी नहीं है .. इसलिए संकलक के अनुसार, System.exit() के बाद कोड निष्पादित हो सकता है
जोड़ा लेखक sanbhat, स्रोत

x का मान यदि 1 या 2 के आधार पर होगा। अगर is अगर ’है   सत्य अंतिम कथन तक नहीं पहुँचा गया है और यदि यह 'x = 1' गलत है   बयान कभी नहीं पहुंचा।

यह सच नहीं है, क्योंकि आपके पास if के बाद और नहीं है।

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

जहां तक ​​अंतिम चर का संबंध है, यह नहीं हो सकता है दो बार सौंपा

नीचे दिया गया कोड त्रुटि के बिना काम करेगा, चूंकि i == 0 या तो true या false , और x हो सकता है। केवल एक बार सौंपा जाता है

    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    else {
        x=2;
    }
1
जोड़ा
हाँ अब मैं समझ गया। धन्यवाद।
जोड़ा लेखक drarkayl, स्रोत
संपादित प्रश्न पढ़ें।
जोड़ा लेखक drarkayl, स्रोत
उत्तर के लिए धन्यवाद, मुझे आपकी बात मिल गई, लेकिन यदि आपको निष्पादन की धारा दिखाई देती है, तो इसे दो बार निर्दिष्ट नहीं करना चाहिए।
जोड़ा लेखक drarkayl, स्रोत
आप कहते हैं कि x = 1 और फिर x = 2 इसलिए x दो बार सौंपा जा रहा है
जोड़ा लेखक sanbhat, स्रोत
@drarkayl System.exit को कोड समाप्ति के रूप में नहीं माना जाता है ... इसकी वापसी नहीं है .. इसलिए संकलक के अनुसार, System.exit() के बाद कोड निष्पादित हो सकता है
जोड़ा लेखक sanbhat, स्रोत

कंपाइलर System.exit के अलावा कुछ भी नहीं जानता है कि यह एक फ़ंक्शन है। यह मानता है, निष्पादन जारी रहेगा।

System.exit के बाद वापसी जोड़ें और यह संकलन करेगा।

1
जोड़ा

कंपाइलर System.exit के अलावा कुछ भी नहीं जानता है कि यह एक फ़ंक्शन है। यह मानता है, निष्पादन जारी रहेगा।

System.exit के बाद वापसी जोड़ें और यह संकलन करेगा।

1
जोड़ा

एक बार जब आप कुछ चर को अंतिम घोषित कर देते हैं तो आप इसे मान नहीं दे सकते

1
जोड़ा

"निश्चित असाइनमेंट" की एक अवधारणा है जावा। जो इस तरह से चलता है।

एक जावा कंपाइलर को एक विशिष्ट रूढ़िवादी प्रवाह विश्लेषण करना चाहिए ताकि यह सुनिश्चित किया जा सके कि स्थानीय चर या रिक्त अंतिम फ़ील्ड f की हर पहुँच के लिए, f निश्चित रूप से एक्सेस से पहले असाइन किया गया है; अन्यथा संकलन-समय त्रुटि उत्पन्न होनी चाहिए।

The idea behind definite assignment is that an assignment to the local variable or blank final field must occur on every possible execution path to the access. The analysis takes into account the structure of statements and expressions; it also provides a special treatment of the expression operators !, &&, ||, and ? :, and of boolean-valued constant expressions.

अब जैसा कि मैंने उल्लेख किया है कि निश्चित विश्लेषण के लिए प्रवाह विश्लेषण जाँच करता है और यह में होता है अगर आपके मामले में खंड और बाहर आप फिर से x का मान बदलने का प्रयास करें और यह अनुमति पाना...

0
जोड़ा

"निश्चित असाइनमेंट" की एक अवधारणा है जावा। जो इस तरह से चलता है।

एक जावा कंपाइलर को एक विशिष्ट रूढ़िवादी प्रवाह विश्लेषण करना चाहिए ताकि यह सुनिश्चित किया जा सके कि स्थानीय चर या रिक्त अंतिम फ़ील्ड f की हर पहुँच के लिए, f निश्चित रूप से एक्सेस से पहले असाइन किया गया है; अन्यथा संकलन-समय त्रुटि उत्पन्न होनी चाहिए।

The idea behind definite assignment is that an assignment to the local variable or blank final field must occur on every possible execution path to the access. The analysis takes into account the structure of statements and expressions; it also provides a special treatment of the expression operators !, &&, ||, and ? :, and of boolean-valued constant expressions.

अब जैसा कि मैंने उल्लेख किया है कि निश्चित विश्लेषण के लिए प्रवाह विश्लेषण जाँच करता है और यह में होता है अगर आपके मामले में खंड और बाहर आप फिर से x का मान बदलने का प्रयास करें और यह अनुमति पाना...

0
जोड़ा