我正在使用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;
}
这个错误的原因很明显。您的代码中有一个分支,您可以在不分配任何值的情况下调用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);
你需要在声明choice
时定义一个值,比如使用int choice = 0;
,或者在catch
子句choice = 0;
中添加一行。