Uiteindelijke variabele toewijzingsfout

Ik weet niet of dit een domme vraag is of niet, maar probeer het alsjeblieft te beantwoorden.

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

Ik heb een laatste variabele x.

Om nu een waarde toe te kennen aan x, heb ik een if-instructie die het toewijst en het programma afsluit.

Nu wordt de laatste verklaring nooit bereikt en daarom zou dit programma logisch moeten compileren.

x heeft waarde 1 of 2, afhankelijk van de if-instructie. Als het 'if' waar is, wordt de laatste instructie niet bereikt en als deze false is, wordt de 'x = 1'-instructie nooit bereikt.

Dus waarom geeft dit me een compileerfout van 'lokale' variabele is geïnitialiseerd?

BEWERK:

ja ik weet duidelijk dat een definitieve verklaring slechts eenmaal kan worden toegewezen.

wat mijn twijfel was, is dat slechts één van die uitspraken tijdens de uitvoering zal worden bereikt, dus als ik ernaar kijk, zou het programma maar één opdrachtverklaring hebben.

1
vink de opmerking aan die spreekt over Definite Assignment in java
toegevoegd de auteur Rupesh, de bron

9 antwoord

Final is Final 

nadat u hebt verklaard en toegewezen, kunt u dit niet opnieuw toewijzen.

En de laatste opdracht is een compilatiecontrole. Zelfs als je de functie verlaat voordat het nog steeds zijn taak doet :).

2
toegevoegd
x = 2; is een opdrachtverklaring ?? De mogelijkheid hier is om een ​​else-voorwaarde toe te voegen en daar toe te wijzen.
toegevoegd de auteur ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, de bron
@LuigiEdlCarno precies het antwoord dat ik zocht. Dank je.
toegevoegd de auteur drarkayl, de bron
maar slechts een van die uitspraken wordt bereikt wanneer de uitvoering plaatsvindt
toegevoegd de auteur drarkayl, de bron
ja maar ik ben niet echt van plan het opnieuw toe te wijzen. het wordt in het verloop van het programma slechts eenmaal toegewezen.
toegevoegd de auteur drarkayl, de bron
@drarkayl Corrent, "... wanneer de uitvoering wordt uitgevoerd" , maar dit is een fout in de compile-time en aangezien uw System.exit (0); -oproep niet een return volgen, neemt de compiler aan dat de opdracht na de if ook wordt uitgevoerd.
toegevoegd de auteur LuigiEdlCarno, de bron
Final is Final 

nadat u hebt verklaard en toegewezen, kunt u dit niet opnieuw toewijzen.

En de laatste opdracht is een compilatiecontrole. Zelfs als je de functie verlaat voordat het nog steeds zijn taak doet :).

2
toegevoegd
x = 2; is een opdrachtverklaring ?? De mogelijkheid hier is om een ​​else-voorwaarde toe te voegen en daar toe te wijzen.
toegevoegd de auteur ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, de bron
@LuigiEdlCarno precies het antwoord dat ik zocht. Dank je.
toegevoegd de auteur drarkayl, de bron
maar slechts een van die uitspraken wordt bereikt wanneer de uitvoering plaatsvindt
toegevoegd de auteur drarkayl, de bron
ja maar ik ben niet echt van plan het opnieuw toe te wijzen. het wordt in het verloop van het programma slechts eenmaal toegewezen.
toegevoegd de auteur drarkayl, de bron
@drarkayl Corrent, "... wanneer de uitvoering wordt uitgevoerd" , maar dit is een fout in de compile-time en aangezien uw System.exit (0); -oproep niet een return volgen, neemt de compiler aan dat de opdracht na de if ook wordt uitgevoerd.
toegevoegd de auteur LuigiEdlCarno, de bron

x heeft waarde 1 of 2, afhankelijk van de if-instructie. Als het 'als' is   waar is het laatste statement niet bereikt en als het false is, is de 'x = 1'   verklaring wordt nooit bereikt.

Dit is niet waar, omdat u geen if gevolgd door else heeft.

Omdat System.exit (0) slechts een functieaanroep is en geen ander codepad, neemt de Java-compiler de code erna aan, om zeer goed bereikbaar te zijn. Zie deze thread voor meer duidelijkheid

Wat de laatste variabele betreft, kan niet twee keer worden toegewezen .

De onderstaande code werkt zonder fouten, omdat i == 0 true of false en x kan zijn wordt slechts één keer toegewezen

    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    else {
        x=2;
    }
1
toegevoegd
ja nu heb ik het. Dank je.
toegevoegd de auteur drarkayl, de bron
lees de bewerkte vraag.
toegevoegd de auteur drarkayl, de bron
Bedankt voor het antwoord, ik begrijp wat je bedoelt, maar als je ziet hoe de uitvoering ervan het niet tweemaal toewijst. Het wordt slechts eenmaal toegewezen.
toegevoegd de auteur drarkayl, de bron
je zegt x = 1 en dan x = 2 dus x krijgt twee keer toegekend
toegevoegd de auteur sanbhat, de bron
@drarkayl System.exit wordt niet beschouwd als code-beëindiging ... het is geen retour ... dus per compiler kan code na System.exit() worden uitgevoerd
toegevoegd de auteur sanbhat, de bron

x heeft waarde 1 of 2, afhankelijk van de if-instructie. Als het 'als' is   waar is het laatste statement niet bereikt en als het false is, is de 'x = 1'   verklaring wordt nooit bereikt.

Dit is niet waar, omdat u geen if gevolgd door else heeft.

Omdat System.exit (0) slechts een functieaanroep is en geen ander codepad, neemt de Java-compiler de code erna aan, om zeer goed bereikbaar te zijn. Zie deze thread voor meer duidelijkheid

Wat de laatste variabele betreft, kan niet twee keer worden toegewezen .

De onderstaande code werkt zonder fouten, omdat i == 0 true of false en x kan zijn wordt slechts één keer toegewezen

    int i=0;
    final int x;
    if(i==0){
        x=1;
        System.exit(0); 
    }
    else {
        x=2;
    }
1
toegevoegd
ja nu heb ik het. Dank je.
toegevoegd de auteur drarkayl, de bron
lees de bewerkte vraag.
toegevoegd de auteur drarkayl, de bron
Bedankt voor het antwoord, ik begrijp wat je bedoelt, maar als je ziet hoe de uitvoering ervan het niet tweemaal toewijst. Het wordt slechts eenmaal toegewezen.
toegevoegd de auteur drarkayl, de bron
je zegt x = 1 en dan x = 2 dus x krijgt twee keer toegekend
toegevoegd de auteur sanbhat, de bron
@drarkayl System.exit wordt niet beschouwd als code-beëindiging ... het is geen retour ... dus per compiler kan code na System.exit() worden uitgevoerd
toegevoegd de auteur sanbhat, de bron

De compiler weet niets anders van System.exit dat het een functie is. Het veronderstelt dat de uitvoering zal doorgaan.

Voeg return toe na System.exit en het zal compileren.

1
toegevoegd

De compiler weet niets anders van System.exit dat het een functie is. Het veronderstelt dat de uitvoering zal doorgaan.

Voeg return toe na System.exit en het zal compileren.

1
toegevoegd

Als u eenmaal een variabele als definitief hebt verklaard, kunt u deze niet als een waarde beschouwen

1
toegevoegd

Er is een concept van "Definitieve toewijzing" is java. Dat gaat zo.

Een Java-compiler moet een specifieke conservatieve stroomanalyse uitvoeren om ervoor te zorgen dat f voor elke toegang van een lokale variabele of leeg eindveld f definitief wordt toegewezen vóór de toegang; anders moet een compileerfout optreden.

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.

Nu zoals ik heb vermeld, controleert stroomanalyse op Definite Assignment en gebeurt het in de if -clausule in uw geval en probeert u buiten u opnieuw de waarde van x te wijzigen en dit zal niet toegestaan...

0
toegevoegd

Er is een concept van "Definitieve toewijzing" is java. Dat gaat zo.

Een Java-compiler moet een specifieke conservatieve stroomanalyse uitvoeren om ervoor te zorgen dat f voor elke toegang van een lokale variabele of leeg eindveld f definitief wordt toegewezen vóór de toegang; anders moet een compileerfout optreden.

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.

Nu zoals ik heb vermeld, controleert stroomanalyse op Definite Assignment en gebeurt het in de if -clausule in uw geval en probeert u buiten u opnieuw de waarde van x te wijzigen en dit zal niet toegestaan...

0
toegevoegd