我有一个有两种方法的类.

  • method1()中,我创建了一个名为Abclocal record.这local record只对method1()可用,因为它在method1()(here are the rules on it according to Java)中是107.

  • method2()中,我创建了一个名为ABClocal 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对此进行了测试,得到了相同的结果.我使用了一个全新的文件,一个全新的文件夹,我将文本(而不是文件)复制并粘贴到一个同名的空文件中.同样的错误.我真的没有比这更干净的测试了.

推荐答案

在Windows上,文件名不区分大小写.这意味着文件名为$ABC.课程和一些Abc美元的东西.无法区分类别.

同时,当然,语言本身是区分大小写的,并且希望文件名和文件中类的名称匹配.

您唯一的办法似乎是重命名类或接口.

Java相关问答推荐

为什么我的画布没有显示在PFA应用程序中?

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

所有 case 一起输入时输出错误,而单独放置时输出正确

如何创建同一类的另一个对象,该对象位于变量中?

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

搜索列表返回多个频道

如何以编程方式保存workBench.xmi?

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

如何在运行docker的应用程序中获取指定的配置文件

记录是类的语法糖吗?

何时调用密封层次 struct 的switch 中的默认情况

视图被推出线性布局-Android

如何调整JButton的大小以适应图标?

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

在具有Quarkus Panache的PostgreSQL中将JSON数据存储为JSONB时,会将其存储为转义字符串

我无法在我的Spring Boot应用程序中导入CSV依赖项

Bash数组的单引号元素并使用空格连接

验证没有';t work on Hibernate Entity';s字段

";重复键的值提示唯一约束«;livre_genre_pkey»";例外

一条Java记录可以保存多少个字段?