java - LinkedList.peek() 导致空指针异常

标签 java android

<分区>

我使用以下代码从 Android Activity 中的 LinkedList 中获取项目

    currentAlarm = alarmQueue.peek();

alarmQueue 本身就是这样创建的,在一个扩展 Application 的类中

public static Queue<Long> getAlarmQueue() {
    if (alarmQueue == null)
    {
        Log.d(TAG, "alarmqueue was null, creating new one");
        alarmQueue = new LinkedList<Long>();
    }
    return alarmQueue;
}

该应用程序处于生产状态并已在 google play 上发布,但有时会出现错误报告,指出包含 .peek() 的行抛出 nullpointerexception。因此我添加了您在上面看到的空检查,因为我认为 alarmQueue 本身是空的。 实际上,经过一些测试,我意识到如果 LinkedList 不包含任何项目,.peek() 会抛出 nullpointerexception。

我明白,它可能会返回 null,但文档并没有说它会抛出异常 Android Doc LinkedList

我在这里错过了什么? 谢谢!

编辑:异常图像证明 Image proof for exception EDIT2:我找到了原因.. 多么可怕的错误...... currentAlarm 的类型是 long 而不是 Long,所以 nullpointerexception 被引发了 long 是原始的数据类型,不能将 null 作为参数:/ 但是,这个错误应该永远不会发生,因为在这一点上,队列内部必须有一些东西,所以我必须继续深入挖掘。但是对于这个错误,一切都很好,并添加了错误处理。

最佳答案

首先,peek() 不会抛出 NullPointerException,它是空的alarmQueue。这可以是如果

  1. getAlarmQueue() 之前未调用过。考虑放弃惰性实例化并改为在构造函数中实例化。
  2. 您遇到了一些糟糕的多线程问题。如果您在 MT 环境中,请考虑使用 volatile(google“double check idiom”直到找到 volatile 解决方案,它是 java 中更复杂的构造之一)。

关于java - LinkedList.peek() 导致空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17164846/

相关文章:

android - 错误: Cause: compileSdkVersion is not specified after install plugin

Android - 开机启动服务

java - Canvas3D 未出现在 Swing 窗口中

java - JOGL 立方体问题入门

java - 在谷歌云实例 rhel7 中导出变量

android - 警报管理器和广播接收器不停止

java - 如何使用相同的模型对象初始化 JavaFX Controller ?

java - Java 中基于字典的搜索优化

Android原生库共享内存

android - 是否有可能在 v1 和 v2 签名方案中使用两个不同的 key ?