Java同名内部类的 NoClassDefFoundError

Windows 不区分文件名的大小写,因此你无法在同一个包中创建两个除大小写外类名完全相同的 Java 文件,但是内部类可以。

1
2
3
4
5
6
7
8
public class Fuck {
public static class FuckYou { }
public static class Fuckyou { }

public static void main(String[] args) {
new Fuck.FuckYou();
}
}

而且这段代码可以通过编译,只有在运行时才会抛出异常:

1
Exception in thread "main" java.lang.NoClassDefFoundError: Fuck$FuckYou (wrong name: Fuck$Fuckyou)

当然,正常人不会去写这样的代码,但是用一些生成工具(例如antlr)生成代码时,就有可能出现内部类类名撞车的风险。这个时候,你需要仔细读异常信息:一个类是 Fuck$FuckYou 而另一个是 Fuck$Fuckyou