Java 实现接口时出现奇怪的异常
我在线程“main”java.lang.NoClassDefFoundError:A(错误名称:A)中遇到异常,我不知道这是由什么引起的Java 实现接口时出现奇怪的异常,java,Java,我在线程“main”java.lang.NoClassDefFoundError:A(错误名称:A)中遇到异常,我不知道这是由什么引起的 public class Test { public static void main(String[] args) { new B(); } } interface a { } class A implements a { } class B extends A { } 编辑:在联机编译器中,它编译当Java编
public class Test
{
public static void main(String[] args)
{
new B();
}
}
interface a { }
class A implements a { }
class B extends A { }
编辑:在联机编译器中,它编译当Java编译源代码时,它会创建多个
.class
文件。例如,它为公共类测试创建Test.class
,为接口a创建a.class
,为类a创建a.class
。这里的问题是某些操作系统中的文件名不区分大小写。这意味着操作系统将a.class
和a.class
视为同一个文件,因此一个文件将覆盖另一个文件
由于区分大小写,联机编译器很可能将这些文件名视为不同的文件名
这里的解决方案是使用不同的名称,以便在操作系统级别避免这些名称冲突
已建立的Java约定是以大写字母开头所有类和接口名称。如果遵循此约定,则可以避免此问题。如果运行javac
path/to/your/file
,则应在该目录中看到java编译器创建的.class
文件列表。这种方法的问题是接口和类的名称重复,即A(不区分大小写),因此只创建一个.class
。通过更改接口或类的名称重试,您的问题应该会消失。这是一个文件吗?接口和类应该大写,无论如何是的,命名为Test.javaAnd,您使用什么来运行该文件?您的Java版本是什么?您使用的是什么操作系统?这是Windows吗?此外,Java中的类型名称应始终大写。“为接口a测试$a.class”为什么a
不是嵌套类型。@Pshemo我想Java编译器会为私有类生成带有$syntax的类文件。在那个细节上我可能弄错了。潜在的问题仍然是操作系统如何处理文件名中的大小写差异。“因此,对于私有类,Java不会使用$syntax创建文件”嗯,私有类只能存在于其他类中(嵌套),因此它们将以OuterClass$InnerClass
的形式出现,但这里的类不是私有的,它们没有指定的访问修饰符,因此它们是包私有的-它们属于整个包(只允许访问同一包中的元素)。@Pshemo那么生成的类文件的名称是什么?