2015-06-05 15 views
6

favore qualcuno può illuminarmi sulla seguente questione:Dichiarare variabile fuori Ciclo Foreach in Java

public class Loopy { 
    public static void main(String[] args) 
    { 
     int[] myArray = {7, 6, 5, 4, 3, 2, 1}; 

     int counterOne; 
     for (counterOne = 0; counterOne < 5; counterOne++) { 
      System.out.println(counterOne + " "); 
     } 
     System.out.println(counterOne + " "); 

     int counterTwo = 0; 
     for (counterTwo : myArray) { 
      System.out.println(counterTwo + " "); 
     } 

    } 

} 

Nel ciclo for, dichiariamo counterOne di fuori del ciclo e usarlo all'interno del ciclo. Questo è corretto, a patto che non usiamo counterOne dopo che il ciclo è completato.

Nel ciclo foreach, dichiariamo anche counterTwo fuori dal ciclo e quindi lo usiamo solo nel ciclo. Tuttavia, viene generato un errore in questo caso:

"Exception in thread "main" java.lang.RuntimeException: Uncompilable codice fonte - non riesce a trovare il simbolo simbolo: Luogo counterTwo: classe package1.Loopy"

Potete aiutarmi a capire perché?

L'unica differenza tra i due è che counterOne viene inizializzato a zero e quindi i valori vengono assegnati in modo incrementale (inferiore a 5).

Nel ciclo foreach, counterTwo è assegnato uno per uno, ogni elemento dell'array.

Il programma funziona se facciamo questa regolazione nel secondo ciclo for: for(int counterTwo : myArray), mentre il primo per i lavori in entrambi i casi:

  1. quello esistente
  2. for (counterOne = 0; counterOne < 5; counterOne++)
+1

ho rinominato le variabili nel codice per scopi di leggibilità ad altri che possono incontrato questa domanda (che ho personalmente mai provato questo e lo trovo interessante). –

risposta

11

Da this section of the Java Language Specification circa potenziato for -loops:

la maggiore istruzione for ha la forma:

EnhancedForStatement:

for ({VariableModifier} UnannType VariableDeclaratorId : Expression) Statement

EnhancedForStatementNoShortIf:

for ({VariableModifier} UnannType VariableDeclaratorId : Expression) StatementNoShortIf

noti che la dichiarazione di tipo UnannType deve essere presente nel loop for. Pertanto, è necessario scrivere il ciclo nel modo seguente:

for (int z : x) {