为什么在检查数组字符串是否为空时,我得到一个nullpointer异常?

时间:2012-11-16 21:37:29

标签: java android arrays string nullpointerexception

为什么我在下面的第二个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)

7 个答案:

答案 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。因此,如果scoresnull,则此代码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");
}