Java 排序列表引发ArrayIndexOutOfBoundsException
下面的无辜API调用使整个Jersey web应用程序崩溃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
@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的支持不够好。我已经在下面发布了我的解决方案。