IPを変更してシステムにコンパイルしたとき、チャットプログラムはシステムで正常に機能していました。次に、クラスファイルを別のファイルにコピーしましたが、そのシステムでも正常に機能しました。ただし、クライアントがメッセージを送信すると、次のエラーが発生します。
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: Server$WorkerThread
私はWindows7を使用しています。何が問題なのですか?
IPを変更してシステムにコンパイルしたとき、チャットプログラムはシステムで正常に機能していました。次に、クラスファイルを別のファイルにコピーしましたが、そのシステムでも正常に機能しました。ただし、クライアントがメッセージを送信すると、次のエラーが発生します。
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: Server$WorkerThread
私はWindows7を使用しています。何が問題なのですか?
Server$WorkerThread.classという名前のファイルがありません。* .javaファイルに1つの内部クラスを作成すると、コンパイラーは2つの* .classファイルを生成します(1つは包含クラス用、もう1つは内部クラス用)。内部クラス名の名前の前には、それを囲むクラスの名前が付けられ、$文字で区切られます。
編集:私が追加すべきもの(私は推測します):Javaはクラスを怠惰にロードします。Server$WorkerThread.class
これは、jvmが本当に必要になるまでをロードしないことを意味します。そのコードが最初に必要になるのは(当然のことですが)、サーバーがクライアントとの通信を管理するために前述のクラスのインスタンスを作成したいときです。
たとえば、JoshuaBlochによるJavaConcurrency in Practiceをご覧になると、スレッドセーフなシングルトンでのDouble CheckedLockingIdiomの使用に反対することができます。これは、より複雑な例/説明です。