为什么编译器说如果要求变量在循环中通过才可能不初始化变量?

脑FRZ

我正在编写一个程序,该程序计算用户定义的整数中的偶数,奇数和零数。奇怪的是,编译器根本不会编译。它显示“错误:变量号可能尚未初始化”。

据我所知,没有意义的是,此循环将确保number始终初始化。我知道我可以通过在声明中进行初始化来轻松关闭编译器。一直有人告诉我,尽管在声明时进行初始化通常是一个坏主意,以帮助避免逻辑错误。但是我最大的恐惧/困惑是我不知道为什么它不喜欢它。如果有异常,它将在validInput = true任何情况发生之前被捕获,不是吗?因此,当循环进入检查时,由于validInput仍为,它将重新启动false这甚至不是警告,也不是什么。这是一个很难解决的错误。我想念或看不到什么?

我已经阅读了其他有关if-check的案例,这与可能通过或可能不通过的支票不同。除非程序以某种方式提前退出,否则此循环最终将始终通过(在这种情况下,无论如何它都不会到达for循环)。如果这是重复的话,有人可以指出我找不到的直接相关答案吗?谢谢!

public static void main( String[] args )
{
    long number;
    boolean validInput = false;
    String numStr;
    Scanner input = new Scanner(System.in);

    do
    {
        System.out.print("Please enter an integer:  ");
        numStr = input.next();

        try {
            number = Long.parseLong(numStr);
            validInput = true;
        } catch (NumberFormatException e) {
            System.out.print("That's not an integer. ");
        }
    } while (!validInput);


    // Break each digit up by dividing by powers of 10.
    int evens = 0, odds = 0, zeros = 0;
    for (long temp = number; temp > 0; temp /= 10)
    {
        int digit = (int)(temp % 10);

        if (digit == 0)
        {
            zeros++;
            System.out.println(digit + " is a zero digit.");
        }
        else if (digit % 2 == 0)
        {
            evens++;
            System.out.println(digit + " is an even digit.");
        }
        else
        {
            odds++;
            System.out.println(digit + " is an odd digit.");
        }
    }

    String evenStr = " even " + ((evens == 1) ? "digit" : "digits");
    String oddStr = " odd " + ((odds == 1) ? "digit" : "digits");
    String zeroStr = (zeros == 1) ? " zero" : " zeros";

    System.out.println(number + " has " + evens + evenStr + ", " + odds + oddStr + ", and "
            + zeros + zeroStr + ".");
}
斯瓦·穆

编译器试图说这number不能保证被初始化。例如,如果以下语句引发异常,number则不会初始化:

number = Long.parseLong(numStr);

然后,您捕获了异常,但number尚未被“触及”,因此对该变量的所有进一步使用都可能导致意外行为甚至异常。

摆脱这种情况的通常方法是从一开始就分配变量值:

long number = 0; // just an example, assign whatever value makes sense for you

更新

Java规范可能在这个主题上有更多的启发,特别是“变量的初始值确定赋值”部分

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在循环中初始化数组时Rust编译器为什么会给出未初始化的变量错误?

编译器说变量尚未初始化

为什么我的开关块中出现“变量可能尚未初始化”的编译器错误?

编译器错误“变量x可能尚未初始化”的含义是什么?

为什么Java编译器不理解此变量总是初始化的?

如何在 Rust 代码中使用延迟初始化并通过编译器“可能未初始化的变量”规则?

Visual Studio生成“错误:未初始化的本地变量'x'”,而在线编译器不生成-为什么?

多变量初始化编译器支持

为什么零初始化不是c ++中未初始化变量的默认值?有编译器选项可以强制执行吗?

为什么C和C ++编译器将显式初始化和默认初始化的全局变量放在不同的段中?

为什么编译器将此变量初始化为错误的值?这是对齐问题吗?

为什么编译器禁止初始化数组?

在C中的for循环中初始化迭代器变量

在FOR循环中初始化多个变量

在for循环中初始化变量

为什么这段代码说明变量j可能尚未初始化?它正在循环内初始化

Java中未初始化的类成员不会发出任何编译器错误。但是局部变量可以。为什么?

为什么即使我已分配了未初始化的变量的每个字段,编译器仍会对其发出警告?

为什么编译器报告“可能在此函数中未初始化使用”?

为什么编译器说我的过程中未声明我的表单变量?

为什么当将 void 传递给 int 数组时它不起作用我的编译器说“错误:初始化程序无效”

如果变量没有初始化,为什么这个 C 代码需要这么长时间来编译和执行?

GLSL编译器会删除不必要的变量初始化吗?

Kotlin:“同步”使编译器不确定变量的初始化

编译器未检测到明显未初始化的变量

catch块中的throw语句如何防止未初始化变量的编译器错误?

未初始化变量的错误编译器错误用法

gcc编译器将忽略未初始化的变量警告以进行调试

如何强制编译器为未初始化的变量设置非零值?