首页 > 解决方案 > Android 应用 NullPointerException 它不应该发生在哪里?

问题描述

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

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

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

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

标签: javaandroidnullpointerexceptioncrash

解决方案


好吧,精神调试时间。发生这种情况的唯一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()初始化。itemsfirstItem

在你的情况下,我认为它背后有某种条件,因为它可能不会每次都崩溃,或者你永远不会释放它。但这是一般的想法。


推荐阅读