当前位置: 首页 > 面试题库 >

使用for-each循环时LinkedList中的Nullpointer异常

董霖
2023-03-14
问题内容

我遇到了非常奇怪的Java行为,但我不知道这是一个bug,还是我错过了一些东西。

该代码只需遍历stateStack(LinkedList)列表并销毁所有状态。

public void clearStates()
{
    LogFactory.getLog(StateController.class.getName())
      .info( "Clearing states. #ofstates="+stateStack.size());
    for (State state : stateStack)  // Line 132 (see exception)
    {
        state.destroy();
    }

    // ...
}

引发了以下异常:

INFO  controllers.StateController : Clearing states. #ofstates=1
java.lang.NullPointerException\
    at java.util.LinkedList$ListItr.next(LinkedList.java:891)
    at *.controllers.StateController.clearStates(StateController.java:132)
    // ... //

该代码通常可以正常工作,并且已经投入生产一年多了。

这可能是Java错误吗?

/ 更新 /

destroy()调用不会修改stateStack。如果可以的话,我猜Java会抛出ConcurrentModificationException。

stateStack填充了1个状态,该状态将覆盖destroy,但仅进行本地修改。然后,超级实现将打印不在日志文件中的其他日志(“销毁状态…”),因此我猜想该异常是在迭代开始时抛出的。

public void destroy()
{
    destroyed = true;
    LogFactory.getLog(State.class.getName()).info( "Destorying state : "+getClass().getName());
    propertyChangeSupport.firePropertyChange(PROP_DESTROYED, null, this);
}

问题答案:

下面的代码几乎每次运行它都会生成相同的异常-
想法是在从另一个线程迭代时修改列表。由于幸运的时机,修改发生在该方法之后checkForComodification但之前,从而导致NPE。next = next.next;``ListItr#next

java.util.LinkedList $ ListItr.next(LinkedList.java:891)处的线程“
main”中的java.lang.NullPointerException,javaapplication4.Test1.main(Test1.java:74)处的异常

public class Test {
    public static void main(String[] args) {
        final int SIZE = 100000;
        final Random rand = new Random();
        final List<Integer> list = new LinkedList<>();
        for (int i = 0; i < SIZE; i++) {
            list.add(i);
        }

        Runnable remove = new Runnable() {

            @Override
            public void run() {
                while (true) {
                    int i = rand.nextInt(SIZE);
                    list.remove(i);
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException ex) {
                        break;
                    }
                    list.add(i);
                }
            }
        };
        Thread t = new Thread(remove);
        t.start();
        for (int i = 0; i < 100; i++) {
            try {
                for (Integer j: list) {
                    ///whatever
                }
            } catch (ConcurrentModificationException e) {
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }
        t.interrupt();
    }
}


 类似资料:
  • For Each循环用于为数组或集合中的每个元素执行语句或一组语句。 For Each循环类似于For循环; 但是,为数组或组中的每个元素执行循环。 因此,步进计数器将不存在于这种类型的循环中。 它主要用于数组或在File系统对象的上下文中使用,以便递归操作。 语法 (Syntax) 以下是VBA中For Each循环的语法。 For Each element In Group [state

  • 问题内容: 以下两个循环之间的性能差异(如果有)是什么? 和 问题答案: 版本1.5中引入的for-each循环通过完全隐藏迭代器或index变量,消除了混乱和出错的机会。结果成语同样适用于集合和数组: 当你看到冒号(:)时,将其读为“ in”。因此,上面的循环读为“对于元素中的每个元素e”。请注意,即使对于数组,使用for-each循环也不会降低性能。实际上,在某些情况下,它可能只比普通的for

  • 在上面的代码中,我根据天气与否计算每个指数,每个指数都是=到零。然而,它总是在foreach循环中运行false,在for循环中运行true。有人能解释一下幕后发生了什么让这一切发生吗? 我不是按顺序运行它们,它们都是为了演示目的。

  • 我的for-each循环中出现了这个错误:

  • 我得到的错误是“缺少return语句”,代码如下: 有人能帮帮我吗?多谢.

  • 问题内容: 我正在读一本书,重新整理了我的数据结构,它提出的一个问题是不使用“第一个”和“最后一个”指针来构建一个循环的单链表,而是通过使用一个引用来访问它。当前”。我不确定我是否理解这个问题,我一直以为我至少需要第一个或最后一个。这是我的实现,但是它具有“ first”,不确定如何解决。您能否评论一下如何调整代码以消除对第一代码的依赖? 然后是列表本身: 问题答案: 如果您有一个循环链表,则每个