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

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

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

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

Java

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

Q&A

解決済

3回答

28055閲覧

JavaでNumberFormatExceptionエラーの原因がわからない

URON

総合スコア20

JavaFX

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

Java

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

0グッド

0クリップ

投稿2017/01/04 08:48

編集2017/01/04 13:00

NumberFormatExceptionが発生する原因がわかりません

  • 追記

yonaさんの回答によりNumberFormatExceptionが発生していることがわかりました。自分で調べたのですが正しい形式ではない場合に発生するそうですがこのプログラムは単純に言うと入力した値をファイルに書き込むといったようなものです。ここに整数を入力してもこのエラーになるということはどこがうまくいっていないのでしょうか?
nowmoey.txtの中身は「3」です。

Javaバージョン:jdk1.8.0_91.jdk

(NetBeansのプロジェクトのプロパティの実行→「ランタイム・プラットフォーム」の「管理」にかいてあるバージョンを見ました)

JavaFXバージョン:8.0.91

(/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre/lib/javafx.properties)から参照した

java

1package money; 2 3import java.io.BufferedReader; 4import java.io.File; 5import java.io.FileNotFoundException; 6import java.io.FileReader; 7import java.io.FileWriter; 8import java.io.IOException; 9import java.net.URL; 10import java.util.ResourceBundle; 11import javafx.event.ActionEvent; 12import javafx.fxml.FXML; 13import javafx.fxml.Initializable; 14import javafx.scene.control.Label; 15import javafx.scene.control.TextField; 16public class FXMLDocumentController implements Initializable { 17 @FXML 18 private Label nowmoney; 19 private static boolean checkBeforeReadfile(File file) { 20 if (file.exists()) { 21 if (file.isFile() && file.canRead()) { 22 return true; 23 } 24 } 25 return false; 26 } 27 @FXML 28 private TextField addmoney; 29 30 int aggregate=0; 31 32 33 34 35 36 37 @FXML 38 private void botan(ActionEvent event) { 39 nowmoney.setText(""); 40 String inputmoney = addmoney.getText(); 41 int i = Integer.parseInt(inputmoney); 42 43 try { 44 File file = new File("/Users/uron/Desktop/nowmoney.txt"); 45 46 if (checkBeforeReadfile(file)) { 47 BufferedReader br = new BufferedReader(new FileReader(file)); 48 49 String str; 50 51 while ((str = br.readLine()) != null) { 52 System.out.println(str); 53 nowmoney.setText(str); 54 int 読み込み = Integer.parseInt(str); 55 aggregate += 読み込み; 56 } 57 58 59 br.close(); 60 } else { 61 System.out.println("ファイルが見つからないか開けません"); 62 } 63 } catch (FileNotFoundException e) { 64 System.out.println(e); 65 } catch (IOException e) { 66 System.out.println(e); 67 } 68 69 aggregate += i; 70 71 addmoney.setText(""); 72 73 System.out.println(aggregate); 74 String 表示 = Integer.toString(aggregate); 75 nowmoney.setText(表示 + "円"); 76 try { 77 File file = new File("/Users/uron/Desktop/nowmoney.txt"); 78 79 if (checkBeforeWritefile(file)) { 80 FileWriter filewriter = new FileWriter(file, false); 81 82 filewriter.write(aggregate); 83 filewriter.close(); 84 } else { 85 System.out.println("ファイルに書き込めません"); 86 } 87 } catch (IOException e) { 88 System.out.println(e); 89 } 90 91 } 92 93 private static boolean checkBeforeWritefile(File file) { 94 if (file.exists()) { 95 if (file.isFile() && file.canWrite()) { 96 return true; 97 } 98 } 99 100 return false; 101 } 102 103 104 @Override 105 public void initialize(URL url, ResourceBundle rb) { 106 // TODO 107 108 try { 109 File file = new File("/Users/uron/Desktop/nowmoney.txt"); 110 111 if (checkBeforeReadfile(file)) { 112 BufferedReader br = new BufferedReader(new FileReader(file)); 113 114 String str; 115 while ((str = br.readLine()) != null) { 116 System.out.println(str); 117 nowmoney.setText(str + "円"); 118 } 119 120 br.close(); 121 } else { 122 System.out.println("ファイルが見つからないか開けません"); 123 } 124 } catch (FileNotFoundException e) { 125 System.out.println(e); 126 } catch (IOException e) { 127 System.out.println(e); 128 } 129 130 } 131 132} 133

エラーは

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Node.fireEvent(Node.java:8411) at javafx.scene.control.Button.fire(Button.java:185) at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380) at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416) at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415) at com.sun.glass.ui.View.handleMouseEvent(View.java:555) at com.sun.glass.ui.View.notifyMouse(View.java:937) Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769) ... 45 more Caused by: java.lang.NumberFormatException: For input string: "3" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at money.FXMLDocumentController.botan(FXMLDocumentController.java:56) ... 55 more Deleting directory /Users/uron/NetBeansProjects/Money/dist/run731981009 jfxsa-run: ビルド成功(合計時間: 13秒)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/01/04 09:01

Java と JavaFX のバージョン情報を提示しようか? (upgrade こみで)
mit0223

2017/01/04 12:43

OSはおそらく、Mac OS ですよね。 od -c -t x1 /Users/uron/Desktop/nowmoney.txt の結果を貼ってもらえませんか。
guest

回答3

0

エラーコードを見る限り、いまいち原因を断定できないので nowmoney.txt のデータをコピペしていただければ幸いです。こちらで「Caused by: java.lang.NumberFormatException: For input string: "3"」の3周辺の隠れているであろう文字コードがないか調べてみますと、やはり隠れていました、なにやら[EOF]に相当するものが隠れているようなのです。CP/M系かMS-DOSでないかぎり[EOF]なんてつけないと思うのですが...(わたしも知識不足です)とにかく原因はnowmoney.txtにあります。

追記:
もうすこし詳しく調べてみました再現不可能文字を表示してくれるエディター(おなじみのmousepadです)で、エラーコードをコピペ(質問者様がjavaが吐き出したものをそのままコピペしてくれているのでうまい具合に見つけられます)して、表示した結果です
イメージ説明
この[0003]を調べてみますと、EOFではなく、ETX(END OF TEXT)を表すものみたいです。→ソース
このETXを除去する処理を加えるうまく行くのではないでしょうか。

ETX(0003)を除去するには、以下のコードでいいと思います
追記: swordoneさんとentry01さんからご助言いただき、String#replaceAll()よりもString#trim()のほうが適切であると思ったので改変させていただきます
なお今回のエラー原因は\u0003すなわちETX(END_OF_TEXT)が混入しInteger#parseInt()で実行例外が投げられたことです。

Java

1str = str.trim();

その場しのぎのコードかもしれません。とりあえず、これでエラーを回避してなぜnowmoney.txtにETXが紛れてしまったのか検証する必要がありますね。

今回の場合、数値としてあつかうのでString#trim()を使用し(先頭または)文末の\u0020以下の文字を削除しても問題ありませんでしたが

このさき文字列として扱う処理をプログラムする場合はString#trim()は文字列の先頭と行末にあって消す必要があるかないかにかかわらず空白文字もろとも消してしまうので注意してください。

今回はもうすこし情報をまとめてから回答するべきでした...反省します。

投稿2017/01/04 11:53

編集2017/01/05 11:38
Zooey

総合スコア55

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

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

URON

2017/01/04 12:59

nowmoney.txtの中身は 3 です。
swordone

2017/01/04 22:36

これにtrimって効きませんかね?
退会済みユーザー

退会済みユーザー

2017/01/04 22:47

\u0020 がtrimの境目なんできくはずですね。 まあ line.equals(line.trim()) で制御文字の有無は確認できるかと
Zooey

2017/01/05 11:23

Stringにそんな小便利なメソッドがあったとは...趣味レベルの独学とはいえ3年間以上Javaと付き合っていて流石にそれは無知でした。 String#replaceAll()なんかよりも、改行など空白文字(\u0002以下)を消す場合、目的がはっきりしていて、CRとLFを意識しなくてよい、しかも可読性も高いときたら。 勉強になりました。助言ありがとうございます。
guest

0

ベストアンサー

Macのデフォルトの文字セットとnowmoney.txtのエンコードが不一致である(またはBOMコードがあるとか)などの理由でreadLine()した結果の文字列が正確に"3"ではないのだと思います。例外メッセージには"3"となってますが、実は表示不可能な文字が含まれていたりしないか確認してみてはどうでしょう?

(Macってデフォルトではunixのコマンドが使えないと聞いたことがあるのですが...)odのようなバイナリーダンプコマンドがあるならそれでnowmoney.txtの中身をダンプするか、エラーが発生しているJavaプログラムのところで文字列の中身を表示してみるとよいと思います。

java

1String str = ...; 2System.out.printf("str = %s%n", 3 str.chars() 4 .mapToObj(c -> String.format("%02x", c)) 5 .collect(Collectors.joining(" "))); 6int value = Integer.parseInt(str); 7...

上記はパースする文字列の中身を文字毎に16進数で印字するものですが、期待通りstrの中身が"3"なら
str = 33
と表示されるはずです。


追記:自分は過去にこうしたデバッグをよくやったのである程度ASCIIコードを覚えてしまったのですが、文字列を16進ダンプしただけではわかりにくいので
String.format("%02x:'%<c ", c)
として16進数と文字を両方印字すると分かりやすいかも知れません。こうしておくと印字可能な文字はそのまま表示されますし、印字不可能なものがあっても16進数の内容で「それがなにか」を判読できます。strが期待通り"3"だった場合はstr = 33:'3 と印字されます。
(%cの後ろに空白文字をわざわざ入れているのは印字文字がサロゲートペアの1文字目に該当する文字だった場合その文字の次の文字が文字化けにより見えなくならないようにするための回避策です。)

投稿2017/01/04 13:29

編集2017/01/05 19:55
KSwordOfHaste

総合スコア18400

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

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

0

まずはエラーログを読み方を調べましょう。
今回は、FXMLDocumentController.javaの56行目でNumberFormatExceptionが発生しています。
その行でなぜNumberFormatExceptionが発生するかを調べましょう。

投稿2017/01/04 10:39

yona

総合スコア18155

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問