Android app NullPointerException 哪里不应该发生?

Android app NullPointerException where it should not happen?

我有一个最近发布的 Android 应用程序,我正在从 Google Play 控制台收到崩溃报告。其中一次崩溃很奇怪。它发生在类似于以下的代码中:

private final List<Item> items = new ArrayList<>();

public void addItem(Item item) {
    items.add(item);  // NullPointerException here!!
}

显然items在调用addItem时为null,但在我看来这是不可能的——我已经在声明站点初始化了它。我无法想象这种情况会发生,但这种情况经常发生。有什么想法吗?

好了,心理调试时间到了。 可能发生这种情况的方式是,如果在设置其他变量或显式 init { ... } 块期间将其作为对象 init 的一部分进行调用。

您几乎可以肯定在代码的其他地方做了类似的事情:

import java.util.*;

class Main {
    private static class Item { }
    
    private final Item firstItem = setUpItemsAndReturnFirst();
    private final List<Item> items = new ArrayList<>();

    public void addItem(Item item) {
        items.add(item);  // NullPointerException here!!
    }
    
    private Item setUpItemsAndReturnFirst() {
        Item first = new Item();
        Item second = new Item();
        addItem(first);
        addItem(second);
        return first;
    }
    
    public static void main(String args[]) { 
        new Main();
    } 
}

这包含您的示例代码,并且会在带有 NullPointerException 的那一行崩溃,因为 setUpItemsAndReturnFirst()items 用于初始化 [=15] 的初始化之前被调用=].

我假设它在某种条件下,在你的情况下,因为它可能不会 每次 崩溃,否则你永远不会发布它。但这是总体思路。