0

为什么在下面的第二个 if 语句中出现空指针错误?

如果数组字符串为空,我正在检查该 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;
        }

    }

}

日志猫:

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)
4

7 回答 7

3

你能试着把它 times != null 放在最左边吗?操作顺序是从左到右。

if (times != null && !times.isEmpty() && times != "" && times.length() != 0)

编辑:是的@Simon是对的..times != ""应该是 !times.equal("")

但无论如何,你已经在检查!times.isEmpty(),所以你根本不需要那块。

这应该这样做:

if (times != null && !times.isEmpty() )

于 2012-11-16T21:46:46.217 回答
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()) 

即在条件前面放置空检查并删除不必要的警卫。

于 2012-12-01T17:27:53.647 回答
1

先做if(times!= null)_

然后嵌套在那做!times.isEmpty()

isEmpty() 检查字符串的长度是否为零。不为空或不为空。0 的长度是"",而不是 null

如果它是另一个正在检查的字符串,则同样的原则适用

于 2012-11-16T21:41:09.337 回答
0

变量times not 为空。她没有用空值初始化,而是用空值初始化。

NullPointerException 可以在 TestActivity 类的第 426 行中找到。我认为那一行是:

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");
}
于 2012-11-16T22:55:19.877 回答
0

这不是安全检查。

times != ""

String 的相等运算符测试 2 个 String 是否是同一个对象。相反,使用

!times.equal("")

!=有时可能工作的是“”,因为Java“实习生”字符串并且偶然地,它们可能是同一个对象,但你不应该依赖它。

于 2012-11-16T21:47:37.457 回答
0

实际上,您的分数数组仅在以下情况下才被初始化

!times.isEmpty() && times != null && times != "" && times.length() != 0

是真的。它发生了,所以它不是真的:)。并且在时间上调用方法并将其比较为空是没有意义的。然而,这里没有 NPE,所以让我们省略它。

!times.isEmpty 与 times.legth != 0; 相同

times != "" 只要用 'new' 操作初始化并且没有被实习,它总是为真。

所以所有条件都等于(你可以看到时间不为空)

!times.isEmpty

无论如何,您应该在涉及对已检查对象的方法调用的其他检查之前检查 null 。

于 2012-11-16T22:14:35.547 回答
0

您的问题和您的评论不匹配,但无论您是检查scores还是times必须检查它们是否null first。(否则你会看到 NPE。)

利用:

if (times != null && !times.isEmpty() && times != "" && times.length() != 0)

和:

if (scores != null && scores.length != 0 && scores.length >= 4) {

为什么在下面的第二个 if 语句中出现空指针错误?

当您尝试对变量调用方法时会发生 NullPointerException null。因此,如果scoresnull,则此代码scores.length正在尝试调用null.doSomething(). 你不能要求什么都不做。

于 2012-11-16T21:52:51.133 回答