当我更改 IP 并在我的系统中编译时,我的聊天程序在我的系统中运行良好。然后我将类文件复制到另一个文件中,它在该系统中也可以正常工作。但是,当客户端发送消息时,会出现以下错误:
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: Server$WorkerThread
我使用的是 Windows 7。有什么问题?
当我更改 IP 并在我的系统中编译时,我的聊天程序在我的系统中运行良好。然后我将类文件复制到另一个文件中,它在该系统中也可以正常工作。但是,当客户端发送消息时,会出现以下错误:
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: Server$WorkerThread
我使用的是 Windows 7。有什么问题?
您错过了一个名为Server$WorkerThread.class的文件。如果在 *.java 文件中创建一个内部类,编译器将生成两个 *.class 文件(一个用于封闭类,一个用于内部类)。内部类名称的名称将以封闭类名称为前缀,并由$字符分隔。
编辑:我应该添加的东西(我猜):Java延迟加载类。这意味着 jvm 在Server$WorkerThread.class
真正需要之前不会加载。第一次需要它的代码是(我认为这并不奇怪),当服务器想要创建上述类的实例来管理与客户端的通信时。
您可能想看看Joshua Bloch 的Java Concurrency in Practice等,他在其中提倡反对将Double Checked Locking Idiom用于线程安全的 Singletons。这是一个更详细的示例/解释。