声明一个无用的局部变量

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

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

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

当时没有考虑变量范围,显然这是没用的,因为我无论如何也不能使用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大括号是可选的……显然还有其他考虑因素,或者两者都要编译或失败。

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


编辑:这是完整的function:

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

如果你有一个ifforwhiledo/while你必须跟一个声明。 声明不是声明。

来自JLS 14.9 – if语句

 IfThenStatement: if ( Expression ) Statement IfThenElseStatement: if ( Expression ) StatementNoShortIf else Statement IfThenElseStatementNoShortIf: if ( Expression ) StatementNoShortIf else StatementNoShortIf 

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

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

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