【问题标题】:Sorting List throws ArrayIndexOutOfBoundsException排序列表抛出 ArrayIndexOutOfBoundsException
【发布时间】:2017-01-06 10:29:39
【问题描述】:

以下无辜的 API 调用会导致整个 Jersey Web 应用程序崩溃。

@Path("/sortlist")
public class SortList {
   @GET
   public void sort() {
       List<Dog> test = new ArrayList<>();
       test.add(new Dog("test"));
       test.add(new Dog("blah"));
       test.sort(Comparator.comparing(Dog::getName));
   }

   class Dog {
       private String name;
       public String getName() { return name; }
       public Dog(String name) { this.name = name; }
   }
}

它抛出

javax.servlet.ServletException: Servlet.init() for servlet jersey-serlvet threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)

root cause
java.lang.ArrayIndexOutOfBoundsException: 20343
org.objectweb.asm.ClassReader.<init>(Unknown Source)

但是为什么呢?即使同步排序操作也没有效果。这可能是以下技术之一中的错误吗?你能复制这个问题吗?

  • Tomcat 7.0.73
  • 球衣 1.19.3
  • 码头 9.4.0.v20161208
  • ASM 5.0.4

【问题讨论】:

  • 嗯,堆栈跟踪看起来像是 ClassReader 的构造函数中的异常,而不是您的类...是什么让您认为它与您的 sort() 方法有关?
  • 由于这个方法单独使应用程序崩溃,没有别的。显然,Jersey 对 Java 8 的支持不够好。我已经在下面发布了我的解决方案。

标签: java tomcat collections jersey jetty


【解决方案1】:

显然这是 Jersey Bug 1.X,因为它对 Java 8 的支持不够好。升级到 Jersey 2.X 解决了这个问题。

jersey 1.X 对此的解决方案是使用 Java 7 方法进行排序。

Collections.sort(test, new Comparator<Dog>() {
    @Override
    public int compare(Dog o1, Dog o2) {
        return o1.getName().compareTo(o2.getName());
    }
});

【讨论】:

    猜你喜欢
    • 2016-11-09
    • 2023-03-16
    • 1970-01-01
    • 2021-09-17
    • 2020-02-13
    • 2012-04-12
    • 2013-05-10
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多