2015-11-23 53 views
12

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

  1. Creare un nuovo progetto in Android Studio, vuoto Attività
  2. 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.

+1

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

+1

È un Samsung? – zapl

+0

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

risposta

0

Se siete veramente sicuri che il codice scritto funziona correttamente allora d'ora in poi, è necessario avviare per controllare (ordinato):

  • configurazione -> è la vostra configurazione del progetto del tutto ok con le versioni di Java JDK, o la versione Java è compatibile con le librerie Android utilizzate? Le tue librerie Java e Andorid sono configurate correttamente?
  • ambiente -> il tuo emulatore di debug è una libreria di terze parti o il tuo dispositivo di debug è un dispositivo valido per eseguire il debug del tuo codice? Il tuo sistema operativo di codifica è compatibile con la tua ide, la versione Java o le librerie Android?
  • JVM -> Hai provato a disinstallare e reinstallare con l'origine corretta per Java jdk con la versione che stai utilizzando?

Forse è necessario fornire alcuni dettagli sul proprio ambiente come la versione Java, la versione minima di Android, il SO o l'IDE che si sta utilizzando.

Spero che quei proiettili ti facciano delle associazioni corrette per risolvere il tuo problema.