【问题标题】:Android app NullPointerException where it should not happen? [closed]Android 应用 NullPointerException 它不应该发生在哪里? [关闭]
【发布时间】:2021-02-24 10:02:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 列表真的是ArrayList吗?也可能是 item 为 null 并且列表不接受 null 元素(ArrayList 确实接受 null)。
  • 请贴出异常跟踪,如果可以的话,可以贴出类代码,以及Item类代码。
  • @MA 真的是ArrayList
  • @RoieShlosberg 抱歉,由于 NDA,我无法发布代码,但堆栈跟踪的第一行指向 items.add(item) 行。
  • 尝试检查调用 addItem 的位置。想到的一件事是,您可能会在初始化项目之前从构造函数中调用它。

标签: java android nullpointerexception crash


【解决方案1】:

好的,通灵调试时间。发生这种情况的唯一方式是,如果在设置其他变量或显式 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,因为在 items 用于初始化 firstItem 时,setUpItemsAndReturnFirst() 在初始化之前被调用。

我认为它在你的情况下是某种条件的,因为它可能不会每次都崩溃,或者你永远不会释放它。但这是大意。

【讨论】:

  • 请注意,提供堆栈跟踪将允许确认是否是这种情况。
  • 我不确定我的应用程序中发生了什么,但它以当前形式很好地回答了我的问题。谢谢!很抱歉,我无法找到一种合理的方式来显示问题中的更多细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2019-01-11
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多