2

我使用以下代码从 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() 的行会引发空指针异常。因此,我添加了您可以在上面看到的空检查,因为我认为 alarmQueue 本身为空。实际上,经过一些测试,我意识到如果 LinkedList 不包含任何项目, .peek() 会抛出 nullpointerexception。

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

我在这里想念什么?谢谢!

编辑:异常的图像证明异常的图像证明 EDIT2:我找到了原因.. 多么可怕的错误...... currentAlarm 的类型很而不是L ong,所以只要是原始数据类型并且不能将 null 作为参数,就会引发 nullpointerexception :/ 但是,这个错误永远不会发生,因为此时,队列中必须有一些东西,所以我必须继续深入挖掘。但是对于这个错误,一切都很好,并且添加了错误处理。

4

3 回答 3

2

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

  1. getAlarmQueue() 之前没有被调用过。考虑放弃惰性实例化并在构造函数中实例化。
  2. 你遇到了一些糟糕的多线程问题。如果您在 MT 环境中,请考虑使用volatile(谷歌“仔细检查习语”,直到找到 volatile 解决方案,它是 java 中更复杂的构造之一)。
于 2013-06-18T09:19:48.627 回答
0

由于您已经创建了一个获取 alarmQueue 的方法,因此您应该使用它而不是直接访问列表。您的 getAlarmQueue 方法确保返回的列表不为空。

currentAlarm = getAlarmQueue().peek();
于 2013-06-18T09:13:25.743 回答
-1

替代方案:不要那样做。在你的课堂上,做:

private static final Queue<Long> ALARM_QUEUE = new LinkedList<Long>();

问题解决了!

于 2013-06-18T09:14:58.470 回答