2015-04-20 11 views
12
public class MultithreadingFour { 
     public static void main(String args[]){ 
       A obj = new A(); 
       Task task= new Task(); 
       for(int i=0; i<10; i++) 
         Thread t= obj.newThread(task); 
     } 
} 

błąd kompilacji: Wiele znaczników na tej liniiDla pętli wsporników

Syntax error, insert ";" to complete Statement 
    t cannot be resolved to a variable 
Syntax error, insert "AssignmentOperator Expression" to complete Assignment 
Syntax error, insert ":: IdentifierOrNew" to complete ReferenceExpression 
    Thread cannot be resolved to a variable 

natomiast

public class MultithreadingFour { 
     public static void main(String args[]){ 
       A obj = new A(); 
       Task task= new Task(); 
       for(int i=0; i<10; i++){ 
         Thread t= obj.newThread(task); 
       } 
     } 
} 

kompiluje pomyślnie (nota dodanych nawiasy klamrowe w pętli for).

+1

O co dokładnie pytasz? –

Odpowiedz

13

W języku Java deklaracja zmiennej Thread t = ... technicznie nie jest instrukcją, natomiast blok { ... } jest. Co następuje po for (...) musi być oświadczeniem.

8

Ciało "oświadczenia" musi być "oświadczeniem".

Deklaracja zmiennej lokalnej nie jest instrukcją. Więc nie możesz umieścić deklaracji zmiennej lokalnej jako "instrukcji" dla "instrukcji for".

Oto dozwolone składnia for pętli:

BasicForStatement: for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement

ForStatementNoShortIf: for (ForInitopt ; Expressionopt ; ForUpdateopt) StatementNoShortIf

Czasami warto czytać JLS 14. Blocks and Statements aby uzyskać więcej informacji.

Pomyśl, nielogiczne byłoby zezwolenie na deklarację zmiennej w pętli jednoliniowej, ponieważ nigdy nie można uzyskać do niej dostęp, ponieważ jest ona dostępna tylko w zakresie pętli.

+0

Dzięki @ Jean-Francois, mógł to pokazać jako ostrzeżenie, ale wystąpił błąd? np .: for (int i = 0; i <10; i ++) int y = i ++; chociaż nie używamy tej wartości y, wciąż zwiększamy wartość i. –

+0

@ user3689942 Jonathan Gibbons (programista javac) odpowiada na to w RPF już zamkniętym jako "nie jest problemem", w którym ktoś mający ten błąd doszedł, to był błąd. * "Tak, jest to trochę niespójne, ale tak właśnie jest w specyfikacji, a javac jest zgodny ze specyfikacją." *. Jak możesz przeczytać, nie ma naprawdę konkretnego powodu. Specyfikacje są takie i podążają za specyfikacją. –

+0

Zapytanie RFP to https://bugs.openjdk.java.net/browse/JDK-8024336 –