Quando si sviluppa un'app Android in Android Studio, una variabile utilizzata all'interno di un ciclo while ha un valore errato. Ho ridotto in un banco di prova per un caso molto semplice:Android: la variabile ha un valore errato nel ciclo while
- Creare un nuovo progetto in Android Studio, vuoto Attività
- Aggiungere il seguente codice per l'attività principale
metodo onStart:
@Override
public void onStart() {
super.onStart();
int count = 2;
int index = 1;
int value = 23;
Log.i("test", "value before = " + value);
while (index < count) {
Log.i("test", "value in while loop = " + value);
index++;
value = 0;
}
}
l'uscita quando si esegue l'applicazione di test è:
value before = 23
value in while loop = 0
mentre il risultato dovrebbe essere
value in while loop = 23
Quando il debug, il risultato è come previsto ('valore nel ciclo while = 23'), ma in un normale build di debug, è sbagliato. Il codice disassemblato della classe di attività principale sembra ok, il valore della variabile 'value' è impostato su 0 alla fine del corpo del ciclo while. Quando un codice o una funzione all'interno del corpo del ciclo while utilizza la variabile "value", avrà il valore 0 anziché 23. Nel caso di test, utilizzo l'istruzione Log per semplificare.
Non va male quando cambio la linea
value = 0;
a
if (value == 23) {
value = 0;
}
o quando rimuovo la linea
value = 0;
in modo che appaia come un errore di ottimizzazione . Ma quale ottimizzazione è fatta che potrebbe causare questo? Rende il codice inaffidabile.
Dipende molto dalla specifica versione Java e, soprattutto, dalla JVM specifica. Ma sì, Java fa l'ottimizzazione, la JVM fa l'ottimizzazione runtimetime e lo srotolamento del ciclo può essere tra le ottimizzazioni. Ad esempio, guarda qui: [Politica di srotolamento del ciclo JIT Java?] (Http: // StackOverflow.com/domande/7243221/java-JIT-loop-srotolamento-politica). – paulsm4
È un Samsung? – zapl
Quindi sembra che l'uso effettivo del valore per qualsiasi cosa impedisca all'ottimizzatore di modificare il valore. Curioso che l'affermazione del registro non sembra contare. – mjstam