声明一个无用的局部变量

15

这是一个有点奇怪的问题,我知道这段代码本身没什么用,但我想知道为什么会出现错误:

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

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

当时没有考虑变量作用域,显然这是无用的,因为我无法在 if 之后使用 row。但我不明白为什么会出现我收到的错误:

> 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检查:

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

它将编译通过。我曾以为如果在 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';    
}

7
那个“if”之前和之后是什么? - Nikolay Kuznetsov
1
请在此处编写完整的代码。 - Bhavik Ambani
2个回答

26
如果你有一个ifforwhiledo/while语句,你必须紧跟其后写一个语句。声明不是语句。
来自JLS 14.9 - if语句
IfThenStatement:
    if ( Expression ) Statement

IfThenElseStatement:
    if ( Expression ) StatementNoShortIf else Statement

IfThenElseStatementNoShortIf:
    if ( Expression ) StatementNoShortIf else StatementNoShortIf

我认为他们这样做是因为你声明的任何变量都无法立即使用(除非是相同的声明)


就是这样了。非常感谢! - Mike
1
@PeterLawrey 我不是100%确定,但这句话来自JLS 14.4可能更相关 - "每个局部变量声明语句都_立即包含在一个块中_。"(重点添加) - Kevin K
if 改为 while 会导致相同的错误,所以我非常确定这就是生效的规则。 - Kevin K

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接