2012-02-09 19 views
57

Dlaczego ten pierwszy if kompiluje się dobrze, a drugi nie?Błąd kompilatora podczas deklarowania zmiennej wewnątrz warunku i bez nawiasów klamrowych

if(proceed) {int i;} // This compiles fine. 
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token) 
+2

pokrewne: [Obiekt tworząc oświadczenie w Java nie pozwalają na użycie pętli jednoliniowej. Dlaczego?] (Http://stackoverflow.com/questions/8145663/object-creating-statement-in-java-doesnt-allow-to-use-a-single-line-loop-why) – Lion

Odpowiedz

72

Ponieważ spec język mówi tak:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html

Oświadczenie wprowadza jednostkę do programu i zawiera identyfikator (§3.8), który może być używany w nazwie odnosi się do tego bytu. Deklarowana jednostka jest jedną z następujących czynności:
...
lokalna zmienna, jedną z następujących czynności:
* Zmienna lokalna zadeklarowana w bloku (§14.4)
* Zmienna lokalna zadeklarowana w instrukcji for (§14.14)

pierwszym przykładem deklaruje i w bloku (oznaczonej klamrami). Twoja druga nie jest, ani nie jest to instrukcja for.

Edytowane w celu dodania: Co tylko sprawia, że ​​wspólnota ma sens. Gdyby było to dozwolone, byłoby bezużyteczne. Natychmiast wyszedłby poza zakres.

+1

Wiem, że to jest bezużyteczny. Ale chcę wiedzieć, jaka jest zasada. I dostałem twój punkt Brian. Thanx. – namalfernandolk

+5

JLS (Java Language Spec) to zawsze miejsce, do którego należy się udać :) Szczerze mówiąc, to niesamowite, niektóre z rzeczy, których się uczysz, czytają tylko części w wolnym czasie; Wiem, że wiele się nauczyłem, czego bym nie wiedział. –

+2

W rzeczywistości druga instrukcja zadeklaruje lokalną zmienną w bloku zawierającym instrukcję 'for', więc ta sekcja JLS nie ma zastosowania. Odpowiedź Daniela wskazuje na prawdziwy powód, dla którego ta składnia jest nieważna. – Joni

12

Jest tak, ponieważ nie byłby przydatny kod. Jeśli masz instrukcję if bez nawiasów klamrowych ({}), to tylko pierwszy wiersz/instrukcja po wykonaniu instrukcji if. Więc jeśli zadeklarujesz tylko zmienną lokalną, nie możesz jej użyć nigdzie indziej. Stwierdzenie, że jest absolutnie zbędne.

if(proceed){ 
int i= 0; 
// variable i can be used here 
//... 
} 

if (proceed) int i; // i can not be used anywhere as it is a local variable 
+0

To jest rozsądne wyjaśnienie –

53

Od Java Language Spec.

 
    Block: 
      { BlockStatementsopt } 

    BlockStatements: 
      BlockStatement 
      BlockStatementsBlockStatement 

    BlockStatement: 
      LocalVariableDeclarationStatement 
      ClassDeclaration 
      Statement 

i

 
    IfThenStatement: 
      if (Expression) Statement 

Wydaje się, że int i jest LocalVariableDeclarationStatement, a nie Statement. Więc to nie działa.

+16

+1. To jest prawdziwy powód, dla którego składnia jest nieprawidłowa. Sekcja JLS dotycząca deklaracji wspomnianych w odpowiedzi Briana jest spokrewniona, ale nie prawdziwa. – Joni

3

jeśli (kontynuuj) int i;

Jeśli użyjemy instrukcji if bez nawiasów klamrowych, wykonamy tylko pierwszą linię z if w sposób warunkowy. Inne linie będą wykonywane normalnie.

To jest kompilacja nie powiodła się, ponieważ deklaracja zmiennych lokalnych odbywa się w sposób warunkowy i kompilator zakłada, że ​​nie można jej uzyskać za pomocą instrukcji false.

Jeśli używasz nawiasów klamrowych, to deklaracja zmiennych i użycie zmiennej lokalnej w bloku, a tym samym kompilator, zakłada, że ​​jest to kod osiągalny. Wtedy nie ma błędów kompilatora.

+0

Kompilator * określa *, że nie jest osiągalny, a ponieważ jego zakres został zakończony, nie dlatego, że instrukcja może być fałszywa. – EJP

0

Podobnie jak w języku Java/C++, jeśli piszemy, jeśli bez nawiasów klamrowych, wykonywana jest tylko pierwsza instrukcja W tym przypadku zmienna i jest bezużyteczna.Jesteś deklarowania go if a jej zakres kończy się po tym oświadczeniu, który jest bezużyteczny

W C++ jest to dozwolone, ale Java nie obsługuje tej

+0

Thanx abhi120, wiem, że jest bezużyteczny. Ale chcę wiedzieć, jaka jest zasada. Zobacz odpowiedź Briana Roacha. – namalfernandolk

+0

Nawiasem mówiąc, nie jestem tym, który w dół głosował na twoją odpowiedź abhi120. :) – namalfernandolk