Wy这个代码在变量初始化方面是非法的吗


import java.util.*;
class Example {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
System.out.print("Input an integer : ");
int num = input.nextInt();
int y;
if (num > 100) {
y = 200;
}
if (num < 100) {
y = 200;
}
if (num == 100) {
y = 200;
}
System.out.println(y);
}
}

错误:

Example.java:19: error: variable y might not have been initialized
System.out.println(y);
^

如果没有输入任何if-分支,则y永远不会初始化。由于访问未初始化的局部变量是非法的,编译器会生成一个错误(如JLS§16中所定义(。编译器无法推断必须输入三种情况中的一种。

我建议在第二种情况下使用else,而在第三种情况下则使用else:

import java.util.Scanner;
class Example {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
System.out.print("Input an integer : ");
int num = input.nextInt();
int y;
if (num > 100) {
y = 200;
}
else if (num < 100) {
y = 200;
}
else /* if (num == 100) */ {
y = 200;
}
System.out.println(y);
}
}

Ideone演示

Javac不进行流分析。换句话说,您知道num > 100num < 100num == 100true,但javac不知道。在这种情况下,您可以将ifelse ifelse组合起来,如下所示:

if (num > 100) {
y = 200;
} else if (num < 100) {
y = 200;
} else { // num == 100 must be true
y = 200;
}

您也可以为y指定一些值(例如0(,但上面的解决方案更清楚。

最新更新