【问题标题】:Declaring a useless local variable声明一个无用的局部变量
【发布时间】:2012-12-19 15:56:41
【问题描述】:

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

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

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(scan.hasNextInt()) {
    int row = scan.nextInt();
}

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

有人可以向我解释一下,或者将我指向一个文档来解释为什么我不能在没有大括号的情况下在 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';    
}

【问题讨论】:

  • if 之前和之后发生了什么?
  • 请在这里写下你的完整代码
  • @NikolayKuznetsov - 查看编辑。

标签: java if-statement scope declaration local-variables


【解决方案1】:

如果您有 ifforwhiledo/while,则必须在其后面加上声明。声明不是陈述。

来自JLS 14.9 - The if Statement

IfThenStatement:
    if ( Expression ) Statement

IfThenElseStatement:
    if ( Expression ) StatementNoShortIf else Statement

IfThenElseStatementNoShortIf:
    if ( Expression ) StatementNoShortIf else StatementNoShortIf

我认为他们这样做是因为您声明的任何变量都无法使用,因为它会立即超出范围(相同的声明除外)

【讨论】:

  • 就是这样。非常感谢!
  • @PeterLawrey 我不是 100% 确定,但来自JLS 14.4 的这句话可能更相关——“每个局部变量声明语句立即包含在一个块中。 " (强调)
  • if 更改为while 会导致相同的错误,所以实际上我很确定这是有效的规则
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    相关资源
    最近更新 更多