2012-12-19 37 views
14

Vì vậy, đây là một trong những kỳ lạ, tôi biết mã chính nó là khá vô dụng, nhưng những gì tôi đang tự hỏi tại sao tôi nhận được thông báo lỗi:Khai báo một biến địa phương vô dụng

tôi đang viết một số mã, tôi đã viết này :

if(scan.hasNextInt()) 
    int row = scan.nextInt(); 

Chẳng phải suy nghĩ về phạm vi biến vào thời điểm đó, rõ ràng điều này là vô ích bởi vì tôi không thể sử dụng row quá khứ if anyway. Những gì tôi không nhận được là lý do tại sao tôi đã nhận lỗi tôi đã làm:

> javac hw.java 
hw.java:25: '.class' expected 
    int row = scan.nextInt(); 
     ^
hw.java:25: not a statement 
    int row = scan.nextInt(); 
    ^ 
hw.java:25: illegal start of expression 
    int row = scan.nextInt(); 
      ^
hw.java:25: ';' expected 
    int row = scan.nextInt(); 
       ^

Bây giờ nếu tôi chỉ cần sửa đổi rằng nếu chi phiếu đến:

if(scan.hasNextInt()) { 
    int row = scan.nextInt(); 
} 

Nó sẽ biên dịch tốt. Tôi đã được ấn tượng rằng nếu có 1 dòng dưới if các dấu ngoặc nhọn là tùy chọn ... rõ ràng có những cân nhắc khác là tốt hoặc cả hai sẽ biên dịch hoặc thất bại.

Ai đó có thể giải thích cho tôi hoặc chỉ cho tôi tài liệu giải thích tại sao tôi không thể khai báo biến cục bộ theo số if có điều kiện không có dấu ngoặc nhọn?


EDIT: Dưới đây là đầy đủ chức năng:

public static char getinput() { 
    System.out.println("Where do you want to go? (row column)"); 
    Scanner scan = new Scanner(System.in); 
    if(scan.hasNextInt()) 
     int row = scan.nextInt(); 
    String input = scan.next(); 
    System.out.println(input); 
    return 'a';  
} 
+7

những gì đi kèm trước và sau rằng 'if'? –

+1

Vui lòng viết mã hoàn chỉnh của bạn tại đây –

+0

@NikolayKuznetsov - Xem phần chỉnh sửa. – Mike

Trả lời

25

Nếu bạn có if, for, while, do/while, bạn phải tuân theo tuyên bố đó. Một tuyên bố không phải là một tuyên bố.

Từ JLS 14.9 - The if Statement

IfThenStatement: 
    if (Expression) Statement 

IfThenElseStatement: 
    if (Expression) StatementNoShortIf else Statement 

IfThenElseStatementNoShortIf: 
    if (Expression) StatementNoShortIf else StatementNoShortIf 

Tôi cho rằng họ làm điều này vì bất kỳ biến bạn khai báo không thể được sử dụng vì nó sẽ ra khỏi phạm vi ngay lập tức (trừ việc kê khai giống nhau)

+0

Nó đây rồi. Cảm ơn nhiều! – Mike

+1

@PeterLawrey Tôi không chắc chắn 100%, nhưng câu này từ [JLS 14.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.4) có thể phù hợp hơn - "Mỗi câu lệnh khai báo biến cục bộ được _imiền ngay lập tức bởi một block_." (nhấn mạnh thêm) –

+0

Thay đổi kết quả 'if' thành' while' trong cùng một lỗi, vì vậy tôi thực sự chắc chắn đó là quy tắc có hiệu lực –

1

đoán của tôi là một tuyên bố không phải là một tuyên bố thực thi và tuyên bố với một bài tập thực sự là chia thành hai báo cáo khác nhau bằng các trình biên dịch, với câu lệnh đầu tiên (khai báo) không được thực thi. An nếu yêu cầu một cấu trúc thực thi, hoặc là một khối hoặc một câu lệnh thi hành được.

Tôi biết rằng tôi đã không thể đặt điểm ngắt trên một tuyên bố khai báo không liên kết trong trình gỡ lỗi Eclipse. Có lẽ cùng một lý do cơ bản.