为什么我在下面的第二个if语句中得到一个nullpointer错误?
我正在检查if语句,如果数组字符串scores
是空的,但它总是崩溃说空指针异常。如果有帮助,我还添加了LogCat。
String[] scores;
String times = "";
public void Read() {
FileInputStream inputStream = null;
try {
inputStream = openFileInput("timesfile");
byte[] reader = new byte[inputStream.available()];
while (inputStream.read(reader) != -1) {
}
times = new String(reader);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (!times.isEmpty() && times != null && times != ""
&& times.length() != 0)
{
scores = new String(times).split(",");
Arrays.sort(scores);
}
if (scores.length != 0 && scores != null && scores.length >= 4) { //I get a nullpointer exception here!
better = false;
if (Integer.parseInt(endTime.split(":")[0]) > Integer
.parseInt(scores[0].split(":")[0])) {
better = true;
} else if (Integer.parseInt(endTime.split(":")[1]) > Integer
.parseInt(scores[0].split(":")[1])) {
better = true;
} else if (Integer.parseInt(endTime.split(":")[2]) > Integer
.parseInt(scores[0].split(":")[2])) {
better = true;
} else {
better = false;
}
}
}
logcat的:
11-16 22:32:21.195: E/AndroidRuntime(28584): FATAL EXCEPTION: Thread-2278
11-16 22:32:21.195: E/AndroidRuntime(28584): java.lang.NullPointerException
11-16 22:32:21.195: E/AndroidRuntime(28584): at com.example.app.TestActivity$TestView.scoreRead(TestActivity.java:426)
11-16 22:32:21.195: E/AndroidRuntime(28584): at com.example.app.TestActivity$TestView.over(TestActivity.java:303)
11-16 22:32:21.195: E/AndroidRuntime(28584): at com.example.app.TestActivity$TestView.run(TestActivity.java:267)
11-16 22:32:21.195: E/AndroidRuntime(28584): at java.lang.Thread.run(Thread.java:856)
答案 0 :(得分:3)
您可以尝试将times != null
保留在最左侧。操作顺序是从左到右。
if(times!= null&&!times.isEmpty()&& times!=“”&& times.length()!= 0)
编辑:
是的@Simon是对的.. times != ""
应该是!times.equal("")
但无论如何你已经在检查!times.isEmpty()
,所以根本不需要那件。
这应该做:
if(times!= null&&!times.isEmpty())
答案 1 :(得分:1)
先if(times!= null)
然后嵌套在!times.isEmpty()
isEmpty()检查字符串的长度是否为零。如果它为null,则不是。长度为0是""
,而不是空
如果是另一个正在检查的字符串
,则适用相同的原则答案 2 :(得分:1)
替换
if (scores.length != 0 && scores != null && scores.length >= 4) {
与
if (scores != null && scores.length >= 4) {
替换
if (!times.isEmpty() && times != null && times != "" && times.length() != 0)
带
if (times != null && !times.isEmpty())
即。将空检查放在条件前面并删除不必要的警卫。
答案 3 :(得分:0)
这不是一个安全的检查。
times != ""
String的等于运算符测试2个字符串是否是同一个对象。相反,使用
!times.equal("")
!=
可能有时会工作“”因为Java“实习”字符串并且偶然,它们可能是同一个对象,但你不应该依赖它。
答案 4 :(得分:0)
您的问题和评论不符,但无论您是在检查scores
还是times
,必须检查它们是否为null
第一。 (否则你会看到NPE。)
使用:
if (times != null && !times.isEmpty() && times != "" && times.length() != 0)
和
if (scores != null && scores.length != 0 && scores.length >= 4) {
为什么我在下面的第二个if语句中得到一个nullpointer错误?
当您尝试在null
的变量上调用方法时,会发生NullPointerException。因此,如果scores
为null
,则此代码scores.length
正在尝试调用null.doSomething()
。你什么都不能做什么。
答案 5 :(得分:0)
实际上你的得分数组只有在
时才被初始化!times.isEmpty()&&时代!= null&&时代!=“”&& times.length()!= 0
是真的。它发生了,所以它不是真的:)。并且在按时间调用方法并且将其与null进行比较是没有意义的。但是这里没有NPE,所以我们省略它。
!times.isEmpty与times.legth!= 0;
相同times!=“”一旦用'new'openraton初始化并且没有被实习,它总是为真。
所以所有条件都等于(时间不是空的,你可以看到)
!times.isEmpty
无论如何,在检查对象上的方法调用的其他检查之前,你应该检查null。
答案 6 :(得分:0)
变量次不为空。她没有用空值初始化,而是空值。
可以在TestActivity类的第426行中找到NullPointerException。我认为那行是:
if (scores.length != 0 && scores != null && scores.length >= 4) {
因此,如果您更好地查看代码,得分变量为空,因为上述条件错误。
更改您的代码:
if (!times.isEmpty())
{
scores = times.split(",");
Arrays.sort(scores);
}
if (scores != null && scores.length > 0) {
...
}
else {
System.err.println("There isn't score");
}