質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2710閲覧

NullPointerException等が発生します。

ts271

総合スコア11

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/02/10 08:44

編集2017/02/10 08:52

###前提・実現したいこと
二人用簡易チャットソフトみたいなものを作っています。
サーバーとクライアントの接続まではできるのですが、途中で以下のエラーが発生します

###該当のソースコード・エラーメッセージ
ここ
###試したこと
message.setTextなどをしてみました

###補足情報(言語/FW/ツール等のバージョンなど)
java 1.8.1_121
windows10 home 64bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

全部はみてないですが、

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)

<fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml"> ... <TextField fx:id="msgbox" ... /> ...

コントローラークラス

java

1class CustomController extends VBox { 2 @FXML 3 private TextField msgbox; 4 ... 5 6 CustomController() { 7 FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("chatc.fxml")); 8 fxmlLoader.setRoot(this); //(1) 9 fxmlLoader.setController(this); //(2) 10 fxmlLoader.load(); 11 } 12}

アプリケーションクラス

java

1public class ChatC extends Application { 2 @Override 3 public void start(Stage stage) { 4 CustomController controller = new CustomController(); 5 stage.setScene(new Scene(controller)); 6 ... 7 stage.show(); 8 } 9}

投稿2017/02/10 10:50

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ts271

2017/02/12 05:27

ありがとうございます! 試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問