Java代码中,在使用Collections.sort进行排序时:
Collections.sort(list, new Comparator<Compliance>() {
@Override
public int compare(Compliance o1, Compliance o2) {
return (int)(o2.getTime()-o1.getTime());
}
});
由于new Comparator是匿名内部类,所以,有可能noClassDefFoundError错误,也就是找不到这个匿名类。
类似的地方有:
scheduler.schedule(new Runnable() {……});
暂时未解决,记录一下。
--------------------------------------------这里是分割线,以上是原文章------------------------------------------------
概要
NoClassDefFoundError和ClassNotFoundException非常相似,但区别还是挺大的。前者是在运行时,加载类失败,而后者是在编译时,加载类失败。
我遇到的具体错误:
exception:
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: a/b/c/d/e/f/Example$1
错误的起因
程序中使用了Collections.sort(list, new Comparator<Example>() {...});
分析
其中new Comparator<Example>()会生成一个匿名类,而该匿名类,在IDE开发工具下是不显示Example$1.class的,只会显示出Example.class。而在Example.class的实际存储路径下,确实存在Example$1.class的。
结论
如果是以补丁的方式来升级服务器,那么在类中包含有匿名类时,需要把对应的匿名类也要作为补丁的一部分。
情景举例
1. 排序:
public class Example {
private void someMethod() {
...
list.sort(new Comparator<A>() {...});
...
}
}
会生成:Example.class和Example$1.class。(由于是匿名类,所以只有“$”后边是数字,而不是具体的类的名字)
2.内部类:
public class Example {
class A {}//内部类
static class B {}//静态内部类
}
会生成:Example.class、Example$A.class和Example$B.class三个类。