Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;变量可能尚未初始化";即使我确定它是_Java_Try Catch_Javac - Fatal编程技术网

Java &引用;变量可能尚未初始化";即使我确定它是

Java &引用;变量可能尚未初始化";即使我确定它是,java,try-catch,javac,Java,Try Catch,Javac,我在编译这段代码时遇到了Javac方面的问题: public static int getYear() { Console input = System.console(); Boolean gotYear = false; int year; String userInput = input.readLine(); while (!gotYear) { try { year = Integer.parseInt

我在编译这段代码时遇到了Javac方面的问题:

public static int getYear() {
    Console input = System.console();
    Boolean gotYear = false;
    int year;

    String userInput = input.readLine();

    while (!gotYear) {
        try {
            year = Integer.parseInt(userInput);
            gotYear = true;
        } catch (Exception e) {
            System.out.print("Please insert a valid date. ");
            userInput = input.readLine();
        }
    }

    return year;
}
Javac在返回年份的
行中给出了错误该“变量'year'可能尚未初始化”。但由于它在while循环中,我肯定它已经初始化了。我问我的助教这件事,他无法回答我为什么会这样。他最好的猜测是,Javac并不是一个很好的编译器,无法解决这类问题


基本上,为什么会发生这种错误?我知道我可以通过在进入while循环前一年初始化来修复它,但我想知道是否有其他方法可以实现我试图实现的目标。

否。您必须初始化。局部aka方法变量在使用前必须初始化


局部变量不会获得默认值。在使用之前,必须初始化它们。

必须初始化局部变量。通读以了解基础知识

局部变量主要用于中间计算,而实例变量则应携带用于未来和中间计算的数据。 Java允许对实例变量使用默认值,但对局部变量则需要指定值。因此,为了避免错误,您需要初始化局部变量。

想象一种情况,当您进入

计算结果为true

在这种情况下,不会初始化年份,因为它位于while循环中

while (!gotYear) {
    try {
        year = Integer.parseInt(userInput);
        gotYear = true;
    } catch (Exception e) {
        System.out.print("Please insert a valid date. ");
        userInput = input.readLine();
    }
}
在编译时,java编译器不会计算表达式。因此,gotYear可以取两个值中的任意一个为true或false


局部变量应该在声明它们的相同范围内初始化。初始化应在使用前完成。

您的年份变量在try块中初始化。很明显,在输入OK之前,它不会退出循环。但编译器的规则比这简单:由于初始化可能会被异常中断,它认为该年份可能未初始化。

year
不会在
Integer.parseInt(userInput)时分配给when引发NumberFormatException

然后,
gotYear
仍然是布尔值。FALSE保留在循环中,对于编译器来说太复杂了。它认为你可能会以某种方式退出循环

以下内容应该表现得更好

for (;;) {
    try {
        year = Integer.parseInt(userInput);
        break;
    } catch (Exception e) {
        System.out.print("Please insert a valid date. ");
        userInput = input.readLine();
    }
}
也许编译器只会接受:

for (boolean keepAsking = true; keepAsking; ) {
    try {
        year = Integer.parseInt(userInput);
        keepAsking = false;

顺便说一句,最好使用
boolean
而不是对象包装类
boolean

只需将年份初始化为
-1
,使用现在的代码,“year”变量尚未初始化,可能无法初始化。如果while循环不执行怎么办?只需使用一个默认值,如-1。不要对程序流使用catch块。著名而丑陋的空“for(;;)”和提醒我们Basic的“break”。请问为什么首选使用
boolean
(而不是
boolean
)?boolean是包含true或false的基本类型(如int)。Boolean是对象的子类,包含一个布尔值。因此,它也可以为null。@Julien引入控制变量并不会使它更“结构化”,因为中断与
}
紧密相连,而标志要么作用域太大,要么。。。看到我修改过的答案,我希望它没有抛出一个错误。。如果这是一个警告,我会理解,但是一个错误让我对我的代码感到很糟糕:(正如@Zhuinden在评论中所建议的,当你声明它时,用一个默认值初始化year,编译器将不再生成错误。
for (boolean keepAsking = true; keepAsking; ) {
    try {
        year = Integer.parseInt(userInput);
        keepAsking = false;