所以我试图创建一个搜索数组的for循环,并返回它找到的缺失值。
这是我的方法:
public void questionsMissed() {
int missedQuestions = 0;
for (int i = 0; i < 20; i++) {
if (answers[i] == null){
missedQuestions++;
}
}
System.out.println("You have missed " + missedQuestions + " questions.");
}
错误是if语句的位置。我假设它是因为null。我怎样才能找到缺失值?
错误:无法比较的类型:int和
答案 0 :(得分:3)
您收到错误是因为您尝试将原始数据类型int
与null
进行比较。只能将引用类型与null
进行比较。原始类型总是有一个值 - 它们不能是null
,因此编译器会告诉您比较没有意义。
有两种方法可以解决这个问题:
answers
的类型切换为Integer
- 这样可以检查null
的值,但代价是将原始整数包装成 - 参考包装。int
保留为answer[]
元素的类型,但是会有一个特殊的号码必须在你的程序中的任何地方使用。由于您使用char
值作为答案,我会使用第二种方法,但首先我会制作answers
和correctAnswers
char
数组。未使用的值有一个方便的“特殊值” - 空字符\0'
:
if (answers[i] == '\0') {
...
}
答案 1 :(得分:2)
两件事: -
没有什么比缺少值可以使用null进行比较。您可以将它与0进行比较,因为那些定义的数组成员初始化为0(感谢dasblinkenlight以纠正我,我与C混淆),但这似乎是一个糟糕的决定/选择。
我建议为缺失值设置-1,这通常在哨兵条件检查中进行,然后比较以下值: -
public void questionsMissed() {
int missedQuestions = 0;
for (int i = 0; i < 20; i++) {
if (answers[i] == -1){
System.out.println("OOPS,the element here is missing!");
}
}
}
答案 2 :(得分:1)
您将基本类型int
与null
进行比较。原始类型不是对象,并且始终具有值。因此,您无法将它们与null
进行比较。
如果您使用Integer[]
,可以通过插入null
来标记遗漏的问题,也可以将其与&#39; \ 0&#39;进行比较。
但由于你已经使用了字符文字,我会使用Character
代替。
当您使用原始包装类型时,您的方法也会变得更加容易。 E.g。
Character[] answers = new Character[20];
....
public void questionsMissed() {
int missedQuestions = Collections.frequency(Arrays.asList(answers), '\0');
System.out.println("You have missed " + missedQuestions + " questions.");
}