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

问题描述 投票:0回答:2

我正在使用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;
}
java variables try-catch
2个回答
0
投票

说明

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

在这种情况下,这将是当InputMismatchException发生时,try块然后被中止并且控制流继续catch块。在catch阻止choice被访问后,虽然它没有初始化。

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);

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.