Объявление бесполезной локальной переменной - программирование
Подтвердить что ты не робот

Объявление бесполезной локальной переменной

Итак, это странно, я знаю, что сам код довольно бесполезен, но мне интересно, почему я получаю ошибку:

Я писал код, я написал это:

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

Ответ 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. Вероятно, та же самая основная причина.