声明无用的局部变量

所以这是一个奇怪的,我知道代码本身是相当无用的,但我想知道为什么我得到这个错误:

我正在写一些代码,我写了这个:

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

当时没有考虑变量范围,显然这是无用的,因为无论如何我都不能使用过去。我不明白的是为什么我得到了我所做的错误:rowif

> 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();
                  ^

现在,如果我只是修改它,如果检查到:

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

它将编译良好。我的印象是,如果大括号下有1行是可选的......显然还有其他考虑因素,或者两者都会编译或失败。if

有人可以向我解释,或者指向我一个文档,解释为什么我不能在没有大括号的情况下在条件下声明局部变量?if


编辑:以下是完整的功能:

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';    
}

答案 1

如果您有 、 、 ,则必须在它后面加上一个语句。声明不是声明。ifforwhiledo/while

来自 JLS 14.9 - if 语句

IfThenStatement:
    if ( Expression ) Statement

IfThenElseStatement:
    if ( Expression ) StatementNoShortIf else Statement

IfThenElseStatementNoShortIf:
    if ( Expression ) StatementNoShortIf else StatementNoShortIf

我假设他们这样做是因为您声明的任何变量都不能使用,因为它会立即超出范围(除了相同的声明)


答案 2

我的猜测是,声明不是可执行语句,而带有赋值的声明实际上被编译器分解为两个不同的语句,第一个语句(声明)不可执行。if 需要可执行构造,可以是块,也可以是可执行语句。

我知道我无法在 Eclipse 调试器中的非 sassignment 声明语句上放置断点。可能是同样的根本原因。