在try / catch语句中分配变量?

时间:2018-03-06 02:01:46

标签: java variables try-catch

我使用try / catch语句强制有效的用户输入分配给变量。但是,当我尝试在try / catch语句之外使用此变量时,它告诉我我的变量尚未初始化。使用Java ... Link to picture of error

public static int getChoice() 
{
    //Variables
    int choice;

    do {

        try {
        System.out.println("Press 1 then [Enter] for imperial measurements: ");
        System.out.println("Press 2 then [Enter] for metric measurements: ");
        choice=console.nextInt();
        }

        catch (InputMismatchException inputMismatchException) { //Force valid input of integer

            System.err.println("\nInvalid entry.");
            System.out.println("Press 1 then [Enter] for imperial measurements: ");
            System.out.println("Press 2 then [Enter] for metric measurements: ");
            console.nextLine(); //Flush line buffer
        }


    } while (choice<1||choice>2); //Forces input of either 1 or 2

    return choice;
}

2 个答案:

答案 0 :(得分:0)

您需要在声明choice时定义值,例如使用int choice = 0;,或在catch子句choice = 0;中添加一行。

答案 1 :(得分:0)

说明

此错误的原因很明显。您的代码中有一个分支,您可以在不分配任何值的情况下调用choice。在将某些内容分配给try之前中止choice块时会发生这种情况。

在这种情况下,这将是InputMismatchException发生时,try块随后被中止,控制流继续catch块。访问catchchoice后,虽然它未初始化。

int choice; // Declaration without initialization
do {
    try {
        // ...
        choice = console.nextInt(); // Exception could be thrown
    } catch (InputMismatchException inputMismatchException) {
        // ...
        // Code then continues here, without choice being initialized
    }
} while (choice < 1 || choice > 2); // Access of unassigned variable

解决方案

您有几种方法可以解决此问题。您必须确保不能有一个访问choice未分配的分支。因此,您可以在进入循环之前为其分配默认值:

int choice = -1; // Default value

当然,你需要处理这个特例。

另一种可能性是将它分配给catch块

} catch ( ... ) {
    choice = -1; // Some value indicating an error
}

您可以确保危险分支永远不会到达choice,例如以某种方式中止代码:

} catch ( ... ) {
    throw new IllegalStateException(); // Abort by throwing a non-catched exception
}

您可以使用某种保护变量保护对choice的访问权限:

boolean wasError = false;
int choice;
do {
    try {
        // ...
    } catch (InputMismatchException inputMismatchException) {
        // ...
        wasError = true; // Set the guard
    }

    // Check the guard
    if (wasError) {
        // Something went wrong, abort the loop
        break;
    }
} while (choice < 1 || choice > 2);