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