Java 为什么我会得到;变量可能尚未初始化";重复使用扫描仪直到用户输入合法值后出错?
我正在学习Java,遇到了一种我不理解的行为。我在这里找到的所有类似主题都提供了带默认值初始化的演练(我很乐意使用),但没有人解释为什么下面的方法会产生错误 为了更好地理解Java,我编写下面的代码只是为了隔离问题部分,因此请关注我所问的错误-我知道这段代码没有多大意义。Java 为什么我会得到;变量可能尚未初始化";重复使用扫描仪直到用户输入合法值后出错?,java,if-statement,initialization,try-catch,Java,If Statement,Initialization,Try Catch,我正在学习Java,遇到了一种我不理解的行为。我在这里找到的所有类似主题都提供了带默认值初始化的演练(我很乐意使用),但没有人解释为什么下面的方法会产生错误 为了更好地理解Java,我编写下面的代码只是为了隔离问题部分,因此请关注我所问的错误-我知道这段代码没有多大意义。 public class Test { public static void main(String[] args) { int value; ValueContainer valueContainer;
public class Test {
public static void main(String[] args) {
int value;
ValueContainer valueContainer;
boolean isInputLegal = false;
while (!isInputLegal) {
Scanner scanner = new Scanner(System.in);
try {
System.out.print("Set value ");
value = scanner.nextInt();
isInputLegal = true;
} catch (NumberFormatException | InputMismatchException e) {
scanner.nextLine();
isInputLegal = false;
}
if (isInputLegal) {
valueContainer = new ValueContainer(value);
}
}
valueContainer.printValue();
}
}
class ValueContainer {
int value;
public ValueContainer(int value) {
this.value = value;
}
public void printValue() {
System.out.println(value);
}
}
错误出现在valueContainer=新的valueContainer(值)行中代码>和行中的valueContainer.printValue()代码>
我尝试过的事情:
我想我可能缺少某种异常,所以我用catch(异常e)
替换了catch(异常e)
。没有帮助
我想也许编译器认为循环可以无限大,但仍然不提供初始化,所以我在循环中添加了一个计数器,在1000次迭代后停止循环,并插入一些默认值。没有帮助
我知道,当程序员犯了错误并留下一条导致使用初始化值的路径时,通常会出现此错误,但我90%肯定这里不是这种情况。尝试初始化您的值,因此不要编写:int-value代码>写入:int value=0
,
还可以尝试使用默认构造函数初始化ValueContainer,并使用setter设置其值
public static void main(String[] args) {
int value = 0;
ValueContainer valueContainer = new ValueContainer();
boolean isInputLegal = false;
while (!isInputLegal) {
Scanner scanner = new Scanner(System.in);
try {
System.out.print("Set value ");
value = scanner.nextInt();
isInputLegal = true;
} catch (NumberFormatException | InputMismatchException e) {
scanner.nextLine();
isInputLegal = false;
}
if (isInputLegal) {
valueContainer.setValue(value);
}
}
valueContainer.printValue();
}
这应该是可行的(在ValueContainer类中添加setter方法)Java发现value
仅在try部分初始化,这意味着在抛出异常的情况下可能不会发生初始化。另外,Java并不关注if
条件是什么以及它们代表什么状态,因此,尽管if(isInputLegal)
对人类来说是有意义的,但要确保值
被正确初始化,对于编译器来说,它被视为if(某些条件是不可靠的)
。换句话说,编译器还没有那么聪明,还没有注意到条件是什么(好吧,也许除了处理常量值的部分在编译时是已知的)