我使用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;
}
答案 0 :(得分:0)
您需要在声明choice
时定义值,例如使用int choice = 0;
,或在catch
子句choice = 0;
中添加一行。
答案 1 :(得分: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);