我一直在努力学习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变量可能尚未初始化。"
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循环来检查用户输入,但除此之外,分配值的方法和它们的排序方式是相同的。
答案 0 :(得分:3)
编译器确保在读取它们之前已经分配了所有变量(如果你从未读过它们,或者你用它们做的第一件事是写入它们,那么它们不需要在定义时初始化)。
在第二个示例中,变量仅在满足某些条件时初始化(它们隐藏在if
和while
块之间)。
现在,你可能知道这种情况总是如此,但是编译器并没有这么说,所以它会出错,因为它无法确保变量在循环后始终被初始化。
答案 1 :(得分:1)
编译器无法判断初始化变量的代码是否实际执行。初始化(num1 = input.nextInt()
)发生在if
块内的while
块内。虽然你可以告诉代码将始终执行,但编译器看起来并不那么遥远。
这就是为什么始终将任何变量初始化为其默认值(在这种情况下,整数为0
)的最佳做法
答案 2 :(得分:0)
当这些变量不确定具有默认值
时,您需要在java中初始化变量