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

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

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

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

Java

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

Q&A

解決済

1回答

1792閲覧

JavaFXのエラー処理に関して

YM_anoahiro

総合スコア21

JavaFX

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

Java

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

0グッド

0クリップ

投稿2019/01/10 17:34

編集2019/01/10 18:06

前提・実現したいこと

現在、JavaFXでpingコマンドのデモを作成しようと考えています。
しかし、コンパイルも実行もできるのですが、時折以下のエラーメッセージが発生してしまいます。
お恥ずかしい話、どこからエラーが出ているかさっぱりな状態です。
どのようにエラー処理すればよいのか教えていただければと思います。

発生している問題・エラーメッセージ

「実行」のボタンを押すと時折このエラーが発生します。

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at javafx.graphics/com.sun.javafx.text.PrismTextLayout.addTextRun(PrismTextLayout.java:756) at javafx.graphics/com.sun.javafx.text.GlyphLayout.addTextRun(GlyphLayout.java:140) at javafx.graphics/com.sun.javafx.text.GlyphLayout.breakRuns(GlyphLayout.java:210) at javafx.graphics/com.sun.javafx.text.PrismTextLayout.buildRuns(PrismTextLayout.java:771) at javafx.graphics/com.sun.javafx.text.PrismTextLayout.layout(PrismTextLayout.java:1022) at javafx.graphics/com.sun.javafx.text.PrismTextLayout.ensureLayout(PrismTextLayout.java:222) at javafx.graphics/com.sun.javafx.text.PrismTextLayout.getBounds(PrismTextLayout.java:245) at javafx.graphics/javafx.scene.text.Text.getLogicalBounds(Text.java:430) at javafx.graphics/javafx.scene.text.Text.doComputeGeomBounds(Text.java:1173) at javafx.graphics/javafx.scene.text.Text.access$300(Text.java:127) at javafx.graphics/javafx.scene.text.Text$1.doComputeGeomBounds(Text.java:148) at javafx.graphics/com.sun.javafx.scene.shape.TextHelper.computeGeomBoundsImpl(TextHelper.java:90) at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:117) at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3831) at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3793) at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3741) at javafx.graphics/javafx.scene.Node.updateTxBounds(Node.java:3895) at javafx.graphics/javafx.scene.Node.getTransformedBounds(Node.java:3687) at javafx.graphics/javafx.scene.Parent.getChildTransformedBounds(Parent.java:1864) at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1656) at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1520) at javafx.graphics/javafx.scene.Parent.access$200(Parent.java:81) at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:117) at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:86) at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:117) at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3831) at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3793) at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3741) at javafx.graphics/javafx.scene.Node.updateTxBounds(Node.java:3895) at javafx.graphics/javafx.scene.Node.getTransformedBounds(Node.java:3687) at javafx.graphics/javafx.scene.Parent.getChildTransformedBounds(Parent.java:1864) at javafx.graphics/javafx.scene.Parent.updateCachedBounds(Parent.java:1728) at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1667) at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1520) at javafx.graphics/javafx.scene.Parent.access$200(Parent.java:81) at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:117) at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:86) ~以下略~

該当のソースコード

java

1import javafx.application.Application; 2import javafx.geometry.Insets; 3import javafx.scene.Scene; 4import javafx.scene.control.*; 5import javafx.scene.layout.*; 6import javafx.stage.Stage; 7import javafx.scene.paint.Color; 8import javafx.scene.text.Font; 9import java.util.*; 10 11public class pp extends Application { 12Label l1, l2,l3; // ラベル 13Label[] lb = new Label[5];//ラジオボタン 14 String[] lbin = {"  →自分のPCのIPアドレス(仮)","  →Yahoo!のサイト","  →コロンビアのサイト","  →ブラジルのサイト","  →存在しないIPアドレス"}; 15TextField tx1, tx2; // テキストフィールド 16Button start,clear,kaisetu,ryouhou; // ボタン 17TextArea textArea,ta2; // テキストエリア 18RadioButton[] rb = new RadioButton[5];//ラジオボタン 19 ToggleGroup ping; 20 String[] cm = {"ping 10.40.83.63","ping www.yahoo.co.jp","ping www.columbia.edu","ping www.ibge.gov.br","ping 999.999.999.999"}; 21int num1, num2; 22 23public void start(Stage stage) { 24stage.setWidth(1200); 25stage.setHeight(750); 26 27////////////////////ラベル設定//////////////////// 28l1 = new Label("pingコマンドデモ"); 29l1.setFont(new Font(36)); 30//label1.setTextFill(Color.RED);色の設定 31l2 = new Label("コマンド選択してください"); 32l3=new Label(" "); 33 34for (int i = 0; i <lb.length ; i++) { 35 lb[i] = new Label(lbin[i]);//ラベルの作成 36} 37 38////////////////////ラジオボタン設定//////////////////// 39ping=new ToggleGroup(); 40for (int i = 0; i <rb.length ; i++) { 41 rb[i] = new RadioButton(cm[i]);//ラジオボタンの作成 42 rb[i].setToggleGroup(ping);//ラジオボタンをpingグループに追加 43 rb[i].setStyle("-fx-font-size: 18;");//フォント設定 44} 45rb[0].setSelected(true); 46VBox rbAll = new VBox(); 47 48for(int i=0; i <rb.length ; i++){ 49 rbAll.getChildren().add(rb[i]); 50 rbAll.getChildren().add(lb[i]); 51} 52 53//for (RadioButton r:rb) {//ラジオボタンをVBoxに入れる 54 //rbAll.getChildren().add(r); } 55 56////////////////////ボタン設定//////////////////// 57start = new Button("実行結果表示"); 58start.setPrefSize(100,50); 59start.setOnAction(event -> buttonStartPressed()); 60kaisetu = new Button("解説表示"); 61kaisetu.setPrefSize(100,50); 62kaisetu.setOnAction(event -> buttonKaisetuPressed()); 63ryouhou = new Button("両方とも表示"); 64ryouhou.setPrefSize(205,50); 65ryouhou.setOnAction(event -> buttonRyouhouPressed()); 66clear = new Button("Clear"); 67clear.setPrefSize(205,50); 68clear.setOnAction(event -> buttonClearPressed()); 69 70////////////////////テキストエリア設定//////////////////// 71textArea = new TextArea("実行結果が表示されます。\nC:¥Users>"); 72textArea.setStyle("-fx-text-fill: white;-fx-font-size: 16;"); 73ta2=new TextArea("解説を表示します。");//22文字まで表示可能 74ta2.setStyle("-fx-font-size: 14;"); 75//ta2.setPrefRowCount(10);// 行数を指定 76ta2.setPrefColumnCount(20); // 列数を設定 77ta2.setWrapText(true); 78 79////////////////////配置設定//////////////////// 80HBox hbox = new HBox(5); 81hbox.getChildren().addAll(start,kaisetu); 82 83VBox vbox = new VBox(5); 84vbox.setPadding(new Insets(20, 25, 25, 25)); 85vbox.getChildren().addAll(l1,l2,rbAll,l3,hbox,ryouhou,clear); 86 87BorderPane root = new BorderPane(); 88root.setLeft(vbox); 89root.setCenter(textArea); 90root.setRight(ta2); 91 92stage.setScene(new Scene(root)); 93stage.show(); 94 95textArea.lookup(".content").setStyle("-fx-background-color: black;");//色の変更 96} 97 98void buttonClearPressed(){ 99textArea.clear(); 100textArea.setText("実行結果が表示されます。\nC:¥Users>"); 101ta2.setText("解説が表示されます。"); 102} 103 104void buttonStartPressed(){ 105if (rb[0].isSelected()){ 106 class Hyouzi extends Thread{ 107 public void run(){ 108 textArea.appendText("ping 10.40.83.63\n10.40.83.63 に ping を送信しています 32 バイトのデータ:"); 109 for(int i=0;i<4;i++){ 110 textArea.appendText("\n10.40.83.63 からの応答: バイト数 =32 時間 <1ms TTL=128"); 111 try{ 112 Thread.sleep(1000); 113 }catch(InterruptedException e){ 114 textArea.appendText("\n\nエラーが発生しました。\n\nC:¥Users>"); 115 return; 116 } 117 118 } 119 textArea.appendText("\n\n10.40.83.63 の ping 統計:\n パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)\n ラウンド トリップの概算時間 (ミリ秒):\n 最小 = 0ms、最大 = 0ms、平均 = 0ms"); 120 textArea.appendText("\n\nC:¥Users>"); 121 } 122 } 123 Hyouzi t=new Hyouzi(); 124 t.start(); } 125else if(rb[1].isSelected()){ 126 ~略~(if文の最初の内容とほぼ同じなので省略します。) 127} 128else if(rb[2].isSelected()){ 129 ~略~ 130} 131else if(rb[3].isSelected()){ 132 ~略~ 133} 134else{ 135 ~略~ 136} 137} 138 139void buttonKaisetuPressed(){ 140 if (rb[0].isSelected()){ 141 ta2.setText("自分のPC(仮)にping"); 142 } 143 else if(rb[1].isSelected()){ 144 ta2.setText("yahoo!にping"); 145 } 146 else if(rb[2].isSelected()){ 147 ta2.setText("コロンビアにping"); 148 } 149 else if(rb[3].isSelected()){ 150 ta2.setText("ブラジルにping"); 151 } 152 else{ 153 ta2.setText("偽ipアドレスにping"); 154 } 155} 156 157void buttonRyouhouPressed(){ 158 buttonKaisetuPressed(); 159 buttonStartPressed(); 160} 161 162public static void main(String[] args) { 163launch(); 164} 165} 166

お願い

がちがちの初心者なのでoracleのサイトだけ載せていただいても理解するのが難しいためどのように書けばいいか教えて頂けると幸いです。
また、質問のマナー等が間違っている、内容がわかりにくい等ありましたらご指摘お願いします。

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

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

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

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

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

swordone

2019/01/10 17:58

エラーの上が切れています。***Exceptionまたは***Errorを含み、かつCausedで始まらない行から載せてください。
YM_anoahiro

2019/01/10 18:07

ご指摘ありがとうございます。 編集したのですが、いかがでしょうか?
guest

回答1

0

ベストアンサー

再現させる方法

ご質問のコードの~略~という部分をコメントアウトしたソースで再現を試みましたがなかなか発生しません。ただ後述の問題が原因であると推測し再現確率を上げるべくHyouziクラスの定義を2か所(下記ソース参照)変えた上で「実行結果表示」ボタンを押すと似た現象が起きました。

java

1class Hyouzi extends Thread{ 2 public void run(){ 3 textArea.appendText("ping 10.40.83.63\n10.40.83.63 に ping を送信しています 32 バイトのデータ:"); 4 for (int i = 0; i < 100; i++) { //@@@ここ@@@ 5 textArea.appendText("\n10.40.83.63 からの応答: バイト数 =32 時間 <1ms TTL=128"); 6 try{ 7 Thread.sleep(1); //@@@ここ@@@ 8 }catch(InterruptedException e){ 9 textArea.appendText("\n\nエラーが発生しました。\n\nC:¥Users>"); 10 return; 11 } 12 } 13 textArea.appendText("\n\n10.40.83.63 の ping 統計:\n パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)\n ラウンド トリップの概算時間 (ミリ秒):\n 最小 = 0ms、最大 = 0ms、平均 = 0ms"); 14 textArea.appendText("\n\nC:¥Users>"); 15 } 16}

原因(推測)

以前の自分の回答
https://teratail.com/questions/167482#reply-249876
の対処方法(B)を中途半端に実装しておられることだと思います。どこが中途半端かというと

(B) 別のスレッドでsleepなどによる処理シーケンスを実装し、そのなかで画面の更新をPlatform.runLaterで要求する

の赤字の部分の配慮がないことです。

はっきりわかりませんが、質問者さんの状況は

  • Threadとは何かが曖昧
  • Platform.runLaterが何故必要か不明だったのでとりあえず気にしないことにした

だったのではないかと推測します。「プログラムの並列動作」についての本質的な知識はJavaFX(あるいはswing)のようなGUIライブラリーを用いる際には必要な場面がありますので(少々難解かも知れませんが)曖昧なままにせず把握に努めることをお勧めします。

なお具体的コードについては元の質問に例を示してありますのでそれをよくご覧になってみてください。

投稿2019/01/10 22:33

KSwordOfHaste

総合スコア18392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問