“线程中的异常”;螺纹-0“;java.lang.NoClassDefFoundError:服务器$WorkerThread

“线程中的异常”;螺纹-0“;java.lang.NoClassDefFoundError:服务器$WorkerThread,java,multithreading,exception,noclassdeffounderror,classnotfoundexception,Java,Multithreading,Exception,Noclassdeffounderror,Classnotfoundexception,当我更改IP并在系统中编译时,我的聊天程序在我的系统中运行良好。然后我将类文件复制到另一个文件中,并且在该系统中也运行良好。但是,当客户端发送消息时,会出现以下错误: 线程“thread-0”java.lang.NoClassDefFoundError中的异常:服务器$WorkerThread 我正在使用Windows7。有什么不对劲 缺少名为Server$WorkerThread.class的文件。如果在*.java文件中创建一个内部类,编译器将生成两个*.class文件(一个用于封闭类,一个

当我更改IP并在系统中编译时,我的聊天程序在我的系统中运行良好。然后我将类文件复制到另一个文件中,并且在该系统中也运行良好。但是,当客户端发送消息时,会出现以下错误:

线程“thread-0”java.lang.NoClassDefFoundError中的异常:服务器$WorkerThread

我正在使用Windows7。有什么不对劲

缺少名为Server$WorkerThread.class的文件。如果在*.java文件中创建一个内部类,编译器将生成两个*.class文件(一个用于封闭类,一个用于内部类)。内部类名的名称将以封闭类的名称作为前缀,并用$字符分隔

编辑: 我应该补充一点(我想):Java缓慢地加载类。这意味着jvm不会加载
服务器$WorkerThread.class
,直到真正需要它。第一次需要它的代码时(我想这并不奇怪),服务器想要创建上述类的实例来管理与客户机的通信


您可能想看看Joshua Bloch在实践中的Java并发,他在实践中反对对线程安全的单例使用双重检查锁定习惯用法。这是一个更详细的示例/解释。

这与jre有关吗,因为我刚刚安装了jdk。我的程序是在运行64位的32位操作系统中编译的,但我从不认为这不是问题。就“运行java程序”而言,jre/jdk在这里没有什么区别。两者都包含(相同的)jvm,但jdk带来了额外的工具(javac、javah、visualvm等)。在32位或64位操作系统上编译代码并不重要。编译器将创建相同的(Java-)字节码。我的答案的第一部分与编译器有关(“$”的东西-发生在编译时)。第二部分是关于jvm如何处理类加载(发生在运行时)