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;

我正在学习Java,遇到了一种我不理解的行为。我在这里找到的所有类似主题都提供了带默认值初始化的演练(我很乐意使用),但没有人解释为什么下面的方法会产生错误

为了更好地理解Java,我编写下面的代码只是为了隔离问题部分,因此请关注我所问的错误-我知道这段代码没有多大意义。

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(某些条件是不可靠的)
    。换句话说,编译器还没有那么聪明,还没有注意到条件是什么(好吧,也许除了处理常量值的部分在编译时是已知的)