【问题标题】:When LinkedList size is -1当 LinkedList 大小为 -1 时
【发布时间】:2020-04-01 16:04:33
【问题描述】:

我在一个 java 1.7 项目中遇到了这个异常:

Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: -1
   at java.util.LinkedList.checkPositionIndex(LinkedList.java:558) ~[na:1.7.0_251]
   at java.util.LinkedList.listIterator(LinkedList.java:865) ~[na:1.7.0_251]
   at java.util.AbstractList.listIterator(AbstractList.java:299) ~[na:1.7.0_251]
   at java.util.AbstractSequentialList.iterator(AbstractSequentialList.java:239) ~[na:1.7.0_251]
   at com.project.exceptions.handlers.JsfExceptionHandler.handle(JsfExceptionHandler.java:74) ~[project-0.0.1-SNAPSHOT.jar:na]
   at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119) ~[jsf-impl-2.1.13-redhat-1.jar!/:2.1.13-redhat-1]
   at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) ~[jsf-impl-2.1.13-redhat-1.jar!/:2.1.13-redhat-1]
   at org.springframework.faces.webflow.FlowLifecycle.render(FlowLifecycle.java:80) ~[spring-faces-2.3.2.RELEASE.jar:2.3.2.RELEASE]
   at org.springframework.faces.webflow.JsfView.render(JsfView.java:89) ~[spring-faces-2.3.2.RELEASE.jar:2.3.2.RELEASE]
   at org.springframework.webflow.engine.ViewState.render(ViewState.java:296) ~[spring-webflow-2.3.2.RELEASE.jar:2.3.2.RELEASE]
   at org.springframework.webflow.engine.ViewState.resume(ViewState.java:207) ~[spring-webflow-2.3.2.RELEASE.jar:2.3.2.RELEASE]
   at org.springframework.webflow.engine.Flow.resume(Flow.java:545) [spring-webflow-2.3.2.RELEASE.jar:2.3.2.RELEASE]
   at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:258) [spring-webflow-2.3.2.RELEASE.jar:2.3.2.RELEASE]
   ... 62 common frames omitted

但我不知道在哪种情况下 LinkedList 的大小可能是 -1,不应该是正数吗?有什么建议吗?

自定义异常处理程序代码(第 74 行是 for)

    public class JsfExceptionHandler extends ExceptionHandlerWrapper {
        ...
        @Override
        public void handle() throws FacesException {
            FacesContext fc = ContextUtils.getFacesContextInstance();
            for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
               ...
            }
        }
    }

【问题讨论】:

  • Edit 您的问题并发布您的代码......我们应该如何在不知道您在做什么的情况下提供帮助?见How to Ask
  • 感谢您的回答,我不需要有人调试我的代码,我只需要知道在哪种情况下 LinkedList 的大小可能等于 -1,不应该是一个正数还是最后为零?这是一个笼统的问题,因为也许我只是错过了一些东西。
  • 显示代码对您来说更实用,这样我们就可以找出为什么它返回-1,而不是我们试图猜测它可能发生的所有可能情况.在这种情况下,我们可能不一定会调试您的代码,但我们希望能够解释为什么您至少得到 -1。
  • 我不得不同意这不是@Matteo 的代码的问题,LinkedList.size 怎么能是-1 是一个非常简单的问题。
  • 因为LinkedList 不是线程安全的,是不是您的代码同时从不同线程中删除了列表中的某些项目?

标签: java indexoutofboundsexception


【解决方案1】:

如果我多次运行此代码,我能够重现 LinkedList 的大小为 -1:

         try {
            LinkedList<Integer> integers = new LinkedList<>();
            integers.add(1);
            new Thread(() -> {
                try {
                    Thread.sleep(1950);
                    integers.removeFirst();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();

            Thread.sleep(1950);
            integers.removeFirst();


            System.out.println(integers.size());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

由于LinkedList 不是线程安全的,尝试从不同线程同时从LinkedList 实例中删除一些元素可能会导致大小为-1。

【讨论】:

  • 感谢您的回答,如果我将 MAX_INTEGER+1 项放入列表中,是否得到相同的结果?
  • 是的,如果你运行integers.add(Integer.MAX_VALUE + 1),你应该得到相同的结果,但是代码示例不是确定性的,所以你必须多次运行它才能得到-1。有时你会收到NoSuchElementException
【解决方案2】:

想到的唯一解释是,如果链表通过网络传递,并且发送方在有效负载中明确将其大小设置为 -1。

然后端点将尝试并可能成功通过反射将大小设置为-1。

但这是在黑暗中的一个镜头。

【讨论】:

  • readObject 方法没有明确设置size 字段。相反,它使用for 循环绑定的在线大小。物化对象中的size 不可能以这种方式变为-1。检查代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2016-04-14
  • 2013-08-17
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
相关资源
最近更新 更多