Айнымалы ауыспалы тағайындау қатесі

Мен бұл ақылсыз мәселе екенін білмеймін, бірақ жауап беруге тырысыңыз.

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

Менде соңғы айнымалы x бар.

Енді x мәніне тағайындау үшін, оны тағайындайтын және бағдарламадан шығатын if операторы бар.

Енді соңғы мәлімдемеге ешқашан қол жеткізілмейді, сондықтан бұл бағдарлама логикалық түрде жасалуы керек.

x if if операторына байланысты 1 немесе 2 мәніне ие болады. Егер 'if' шын болса, соңғы мәлімдемеге қол жеткізілмейді және егер ол жалған болса, 'x = 1' сөзіне қол жеткізілмейді.

Неліктен маған «жергілікті» ауыспалы компиляция қателігі берілді?

EDIT:

иә, соңғы мәлімдеме тек бір рет тағайындалатынын білемін.

бұл, менің ойымша, сол бағдарламалардың тек біреуі ғана орындалған кезде орындалады.

1
java-да анық тағайындау туралы сөйлескен пікірді тексеріңіз
қосылды автор Rupesh, көзі

9 жауаптар

Final is Final 

сіз жариялаған және тағайындалғаннан кейін, оны қайта тапсыра алмайсыз.

Ал соңғы тапсырма компиляция уақытын тексеру болып табылады. Сіз өз функциясын орындамас бұрын функциядан шығып жатырсыз :).

2
қосылды
x = 2; тапсырма туралы мәлімдеме болып табылады ма? Мұнда мүмкіндігін қосып, сол жерге тағайындау мүмкіндігі.
қосылды автор ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, көзі
@LuigiEdlCarno дәл іздеп жүрген жауап. Рақмет сізге.
қосылды автор drarkayl, көзі
бірақ бұл мәлімдемелердің біреуі орындалу кезінде орын алады
қосылды автор drarkayl, көзі
иә, бірақ оны шынымен қайта тағайындау емес. ол бағдарлама барысында бір рет тағайындалады.
қосылды автор drarkayl, көзі
@drarkayl Corrent, «орындау орындалса» , бірақ бұл компиляция уақыты қатесі және сіздің System.exit (0); return дегенге ие болса, компилятор тағайындалғаннан кейін орындалатын болады деп есептейді.
қосылды автор LuigiEdlCarno, көзі
Final is Final 

сіз жариялаған және тағайындалғаннан кейін, оны қайта тапсыра алмайсыз.

Ал соңғы тапсырма компиляция уақытын тексеру болып табылады. Сіз өз функциясын орындамас бұрын функциядан шығып жатырсыз :).

2
қосылды
x = 2; тапсырма туралы мәлімдеме болып табылады ма? Мұнда мүмкіндігін қосып, сол жерге тағайындау мүмкіндігі.
қосылды автор ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, көзі
@LuigiEdlCarno дәл іздеп жүрген жауап. Рақмет сізге.
қосылды автор drarkayl, көзі
бірақ бұл мәлімдемелердің біреуі орындалу кезінде орын алады
қосылды автор drarkayl, көзі
иә, бірақ оны шынымен қайта тағайындау емес. ол бағдарлама барысында бір рет тағайындалады.
қосылды автор drarkayl, көзі
@drarkayl Corrent, «орындау орындалса» , бірақ бұл компиляция уақыты қатесі және сіздің System.exit (0); return дегенге ие болса, компилятор тағайындалғаннан кейін орындалатын болады деп есептейді.
қосылды автор LuigiEdlCarno, көзі
x операторына байланысты 1 немесе 2 мәні болады. Егер 'if' болса   шын соңғы сөзге қол жеткізілмейді және егер ол жалған болса, 'x = 1'   өтінішке ешқашан қол жеткізілмеген.

Бұл дұрыс емес, себебі сізде егер және else болса, DONT болады.

Сондай-ақ, System.exit (0) - тек қана функционалдық шақыру болып табылады және басқа код жолынан емес, Java құрастырушысы өте қолжетімді болуы керек. Көбірек түсініктеме алу үшін осы thread бөлімін қараңыз

Соңғы айнымалы мәнге қатысты мүмкін емес екі рет тағайындалады .

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 мәні болады. Егер 'if' болса   шын соңғы сөзге қол жеткізілмейді және егер ол жалған болса, 'x = 1'   өтінішке ешқашан қол жеткізілмеген.

Бұл дұрыс емес, себебі сізде егер және else болса, DONT болады.

Сондай-ақ, System.exit (0) - тек қана функционалдық шақыру болып табылады және басқа код жолынан емес, Java құрастырушысы өте қолжетімді болуы керек. Көбірек түсініктеме алу үшін осы thread бөлімін қараңыз

Соңғы айнымалы мәнге қатысты мүмкін емес екі рет тағайындалады .

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
қосылды

«Белгілі тағайындау» деген тұжырым бар - java. Міне, осындай.

Java құрастырушысы жергілікті айнымалы немесе бос түпкілікті өрістің әрқайсысына қол жеткізу үшін анықталғанына көз жеткізу үшін нақты консервативті ағын талдауын жүргізуі керек; әйтпесе компиляция уақытында қате болуы керек.

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
қосылды

«Белгілі тағайындау» деген тұжырым бар - java. Міне, осындай.

Java құрастырушысы жергілікті айнымалы немесе бос түпкілікті өрістің әрқайсысына қол жеткізу үшін анықталғанына көз жеткізу үшін нақты консервативті ағын талдауын жүргізуі керек; әйтпесе компиляция уақытында қате болуы керек.

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
қосылды