質問: ### 前提・実現したいこと 二人用簡易チャットソフトみたいなものを作っています。 サーバーとクライアントの接続まではできるのですが、途中で以下のエラーが発生します ### 該当のソースコード・エラーメッセージ ここ ### 試したこと message.setTextなどをしてみました ### 補足情報(言語/FW/ツール等のバージョンなど) java 1.8.1_121 windows10 home 64bit
回答: 全部はみてないですが、 String me = msgbox.getText(); でNPEが起こっていて原因はmsgboxがnullだからと思います。メンバー定義をみると @FXML static TextField msgbox; となっています。(これ・・・FXMLLoader.loadでエラーにならないんですですね・・・)なぜstaticにしたかは想像できますが根本的な対策になっていないと思います。 現在の動きでは・・・ * アプリケーション開始 ChatC(Applicationの派生)のインスタンスがJavaFxランタイムにより自動的に作られてstartが呼ばれます。 * FXMLのロード startでFXMLoader#loadしてますがChatCがコントローラークラスとしてFXMLファイルに定義されているためloadの中でコントローラークラスとしてのChatCの別のインスタンスが生成されてしまいます。 同一プログラムの中にApplicationインスタンス(ChatCなど)が複数できてしまい、しかもアプリケーションとしての役割とコントローラーとしての役割をごちゃまぜに実装しているためプログラムが破たんしている気がします。 対処: いくつか方法はあると思います。アプリケーションクラスとコントローラークラスを兼任するクラスもできるとは思いますが個人的にやったことがないので、別クラスにする方法をお勧めしてみます。 FXMLを使用したカスタム・コントロールの作成 ここのページの図4-1,図4-3周辺を参照してVBoxの派生クラスをコントローラーとしてそのまま利用してはいかがでしょうか。下記コードの(1),(2)がポイントです。こうすることでFXMLLoaderがコントローラークラスを生成するのではなくsetController,setRootであらかじめ指定したインスタンスがコントローラーとなります。 FXML(chatc.fxml) ``` ... ... ``` コントローラークラス ``` class CustomController extends VBox { @FXML private TextField msgbox; ... CustomController() { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("chatc.fxml")); fxmlLoader.setRoot(this); //(1) fxmlLoader.setController(this); //(2) fxmlLoader.load(); } } ``` アプリケーションクラス ``` public class ChatC extends Application { @Override public void start(Stage stage) { CustomController controller = new CustomController(); stage.setScene(new Scene(controller)); ... stage.show(); } } ```