Java 排序列表引发ArrayIndexOutOfBoundsException

Java 排序列表引发ArrayIndexOutOfBoundsException,java,tomcat,collections,jersey,jetty,Java,Tomcat,Collections,Jersey,Jetty,下面的无辜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(Compa

下面的无辜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; }
   }
}
@Path(“/sortlist”)
公共类分类表{
@得到
公共无效排序(){
列表测试=新建ArrayList();
测试。添加(新狗(“测试”));
测试。添加(新狗(“废话”);
test.sort(Comparator.comparing(Dog::getName));
}
班犬{
私有字符串名称;
公共字符串getName(){return 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)
javax.servlet.ServletException:servlet的servlet.init()引发异常
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
根本原因
java.lang.ArrayIndexOutOfBoundsException:20343
org.objectweb.asm.ClassReader。(未知源)
但是为什么呢?即使同步排序操作也没有效果。这可能是以下技术中的一个缺陷吗?你能重复这个问题吗

  • Tomcat 7.0.73
  • 泽西岛1.19.3
  • 码头9.4.0.v20161208
  • ASM 5.0.4

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

      jersey 1.X的解决方案是使用Java7方法进行排序

      Collections.sort(test, new Comparator<Dog>() {
          @Override
          public int compare(Dog o1, Dog o2) {
              return o1.getName().compareTo(o2.getName());
          }
      });
      
      Collections.sort(测试,新比较器(){
      @凌驾
      公共整数比较(狗o1,狗o2){
      返回o1.getName().compareTo(o2.getName());
      }
      });
      
      显然这是Jersey Bug 1.X,因为它对Java8的支持不够好。升级到Jersey 2.X解决了这个问题

      jersey 1.X的解决方案是使用Java7方法进行排序

      Collections.sort(test, new Comparator<Dog>() {
          @Override
          public int compare(Dog o1, Dog o2) {
              return o1.getName().compareTo(o2.getName());
          }
      });
      
      Collections.sort(测试,新比较器(){
      @凌驾
      公共整数比较(狗o1,狗o2){
      返回o1.getName().compareTo(o2.getName());
      }
      });
      
      堆栈跟踪看起来异常在
      ClassReader
      的构造函数中,而不是在您的类中。。。是什么让您认为它与您的
      sort()
      方法有关?因为只有这个方法会使应用程序崩溃,所以没有其他方法。显然,Jersey对Java8的支持不够好。我在下面发布了我的解决方案。堆栈跟踪看起来像是
      ClassReader
      的构造函数中的异常,而不是您的类。。。是什么让您认为它与您的
      sort()
      方法有关?因为只有这个方法会使应用程序崩溃,所以没有其他方法。显然,Jersey对Java8的支持不够好。我已经在下面发布了我的解决方案。