在Java中,什么时候需要初始化变量?

3

我一直在尝试学习Java,但在变量初始化方面遇到了障碍。在这两个示例中,程序从键盘获取输入,按升序对值进行排序,然后打印结果。这两个程序都可以编译并正常运行,但其中一个需要对变量进行初始化,而另一个则不需要。

在这个示例中,我没有初始化任何内容,但程序仍能编译通过且没有错误。

    int num1, num2, num3, temp;      // DIDN'T INITIALIZE

    Scanner input = new Scanner(System.in);

    System.out.print("Enter an integer: ");
    num1 = input.nextInt();

    System.out.print("Enter an integer");
    num2 = input.nextInt();

    System.out.print("Enter an integer: ");
    num3 = input.nextInt();

    if (num1 > num2) {temp = num1; num1 = num2; num2 = temp;}
    if (num2 > num3) {temp = num2; num2 = num3; num3 = temp;}

    if (num1 > num2) {temp = num1;num1 = num2; num2 = temp;}

    System.out.println(num1 + " " + num2 + " " + num3 );

然而,在这个例子中,如果我不从一开始初始化变量,就会出现错误,提示“java variables might not have been initialized.”

    int num1=0 , num2=0, num3=0, temp, i=0;  // MUST INITIALIZE VARIABLES!!

    Scanner input = new Scanner(System.in);
    while (i < 3) {
        System.out.print("Enter an integer: ");
        while(true){
            while (!input.hasNextInt()) {
                System.out.print("Not an integer!! Please enter an integer: ");
                input.next();
            }
            if (i < 1) {num1 = input.nextInt();break;}
            if (i < 2) {num2 = input.nextInt();break;}
            if (i < 3) {num3 = input.nextInt();break;}
        }
        i++;
    }

    if (num1 > num2) {temp = num1; num1 = num2; num2 = temp;}
    if (num2 > num3) {temp = num2; num2 = num3; num3 = temp;}

    if (num1 > num2) {temp = num1;num1 = num2; num2 = temp;}

    System.out.println(num1 + " " + num2 + " " + num3 );

这两个程序唯一的区别在于第二个程序使用 while 循环来检查用户输入,但除此之外,它们分配值的方法和排序方式都是相同的。
3个回答

3
编译器确保在读取变量之前所有的变量都已被赋值(如果您从未读取它们,或者您对它们所做的第一件事是写入它们,则无需在定义时初始化)。
在第二个示例中,只有在满足某些条件时才会初始化变量(它们隐藏在ifwhile块之间)。
现在,您可能知道这总是成立的,但编译器并不推理到那么远,因此它将出错,因为它不能确保变量在循环后始终已被初始化。

1
编译器无法确定初始化变量的代码是否真正执行。初始化(num1 = input.nextInt())发生在while块内的if块中。虽然您可以确定该代码将始终执行,但编译器不会预见得那么远。
这就是为什么始终将任何变量初始化为其默认值(在本例中为整数的0)被认为是最佳实践的原因。

我认为将变量初始化为默认值是一种不好的做法,因为这会使编译器无法在您忘记为其分配“真实”值时向您报错。它还会防止您将变量设置为final - Thilo
这是非常好的建议。谢谢你们。我明天有一场期中考试,肯定会初始化所有东西以确保安全。 - Expodecay

0

在Java中,当这些变量不确定是否具有默认值时,您需要初始化变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接