我有一个有两种方法的类.
-
在
method1()
中,我创建了一个名为Abc
的local record
.这local record
只对method1()
可用,因为它在method1()
(here are the rules on it according to Java)中是107. -
在
method2()
中,我创建了一个名为ABC
的local interface
.请注意,此处存在大小写差异.local record
被命名为Abc
,但这local interface
被命名为ABC
.
这是课程.
//package ..... //commenting out package information, as I sincerely doubt that is the cause
/** There seems to be a class loader error when running the below method in main(). */
public class ClassLoaderIssue
{
/** Method 1. */
private void method1()
{
record Abc(int a)
{
public static String iDontCare()
{
return "ignore this method";
}
}
System.out.println(Abc.iDontCare()); //error
}
/** Method 2. */
private void method2()
{
interface ABC
{
}
}
/**
*
* Main method.
*
* @param args commandline arguments that we don't care about for this example.
*
*/
public static void main(String[] args)
{
new ClassLoaderIssue().method1();
}
}
这是我得到的一个例外.
Exception in thread "main" java.lang.NoClassDefFoundError: ClassLoaderIssue$1ABC (wrong name: ClassLoaderIssue$1Abc)
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at ClassLoaderIssue.method1(ClassLoaderIssue.java:23)
at ClassLoaderIssue.main(ClassLoaderIssue.java:49)
下面是一些相关信息.
Java compile command = C:\Program Files\Java\jdk-17.0.2\bin\javac.exe
Java run command = C:\Program Files\Java\jdk-17.0.2\bin\java.exe
显然,这只是一个可以运行的问题示例,但我的情况是,在我的域的边缘有local class/enum/record
个来处理奇怪的状态是非常方便和有用的.因此,我经常使用这种模式,但这是我第一次遇到这个问题.
很明显,有很多方法可以解决这个问题.最简单的是,我可以将枚举重命名为一个.我已经试过了,而且成功了.接口也一样.
但为什么会发生这种情况?
EDIT-我还用Java 18对此进行了测试,得到了相同的结果.我使用了一个全新的文件,一个全新的文件夹,我将文本(而不是文件)复制并粘贴到一个同名的空文件中.同样的错误.我真的没有比这更干净的测试了.