2015-06-05 17 views
6

Czy ktoś mógłby mnie oświecić o następującej treści:Deklarowanie zmiennej Poza Foreach Loop w Javie

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 + " "); 
     } 

    } 

} 

W pętli for, deklarujemy counterOne zewnątrz pętli i użyć go wewnątrz pętli. Jest to poprawne, o ile nie używamy counterOne po zakończeniu pętli.

W pętli foreach deklarujemy również counterTwo poza pętlą, a następnie używamy jej wewnątrz pętli tylko. Jednak błąd jest generowany w tym przypadku:

„Wyjątek w wątku«głównym»java.lang.RuntimeException: Uncompilable kodu źródło - nie można odnaleźć symbol symbol: lokalizacja klasa counterTwo: Klasa package1.Loopy”

Czy możesz mi pomóc zrozumieć dlaczego?

Jedyna różnica między nimi polega na tym, że counterOne jest inicjowane na zero, a następnie przypisywane są wartości przyrostowo (mniejsze niż 5).

W pętli foreach counterTwo jest przypisywany jeden po drugim, każdy element tablicy.

Program działa, jeśli robimy to korekty w drugiej pętli for: for(int counterTwo : myArray), zaś pierwszy dla prowadzenia prac w obu przypadkach:

  1. istniejący
  2. for (counterOne = 0; counterOne < 5; counterOne++)
+1

I przemianowany zmiennych w kodzie dla celów czytelności innym, którzy mogą zetknąć się z tym pytaniem (ja osobiście mam nigdy nie próbowałem tego i uważałem to za interesujące). –

Odpowiedz

11

Od this section of the Java Language Specification o ulepszonym for -lub:

Udoskonalony dla oświadczenia ma postać:

EnhancedForStatement:

for ({VariableModifier} UnannType VariableDeclaratorId : Expression) Statement

EnhancedForStatementNoShortIf:

for ({VariableModifier} UnannType VariableDeclaratorId : Expression) StatementNoShortIf

Należy pamiętać, że deklaracja typu UnannType musi być obecna w pętli for. Dlatego powinieneś napisać pętlę w następujący sposób:

for (int z : x) { 
Powiązane problemy