Объявление бесполезной локальной переменной
Итак, это странно, я знаю, что сам код довольно бесполезен, но мне интересно, почему я получаю ошибку:
Я писал код, я написал это:
if(scan.hasNextInt())
int row = scan.nextInt();
В то время не думал о области переменных, очевидно, это бесполезно, потому что я не могу использовать row
в прошлом if
. Я не понимаю, почему я получил ошибку, которую я сделал:
> 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
без фигурных скобок?
EDIT: Здесь полная функция:
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
Если у вас есть if
, for
, while
, do/while
, вы должны следовать за ним с помощью инструкции. Декларация не является выражением.
От JLS 14.9 - Утверждение if
IfThenStatement:
if ( Expression ) Statement
IfThenElseStatement:
if ( Expression ) StatementNoShortIf else Statement
IfThenElseStatementNoShortIf:
if ( Expression ) StatementNoShortIf else StatementNoShortIf
Я предполагаю, что они делают это, потому что любая переменная, которую вы объявляете, не может быть использована, поскольку она будет недоступна сразу же (кроме той же декларации)
Ответ 2
Я предполагаю, что объявление не является исполняемым оператором, а объявление с присваиванием действительно разбито на два разных оператора компилятора, причем первый оператор (декларация) не является исполняемым. Для if требуется исполняемая конструкция, либо блок, либо исполняемый оператор.
Я знаю, что мне не удалось установить точку останова в объявлении объявления, отличного от sassignment, в отладчике Eclipse. Вероятно, та же самая основная причина.