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

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

ただいまの
回答率

90.61%

  • Java

    13494questions

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

  • JavaFX

    394questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,607

URON

score 14

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)から参照した

package money;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class FXMLDocumentController implements Initializable {
    @FXML
    private Label nowmoney;
    private static boolean checkBeforeReadfile(File file) {
        if (file.exists()) {
            if (file.isFile() && file.canRead()) {
                return true;
            }
        }
        return false;
    }
    @FXML
    private TextField addmoney;

    int aggregate=0;






    @FXML
    private void botan(ActionEvent event) {
        nowmoney.setText("");
        String inputmoney = addmoney.getText();
        int i = Integer.parseInt(inputmoney);

        try {
            File file = new File("/Users/uron/Desktop/nowmoney.txt");

            if (checkBeforeReadfile(file)) {
                BufferedReader br = new BufferedReader(new FileReader(file));

                String str;

                while ((str = br.readLine()) != null) {
                    System.out.println(str);
                    nowmoney.setText(str);
                    int 読み込み = Integer.parseInt(str);
                    aggregate += 読み込み;
                }


                br.close();
            } else {
                System.out.println("ファイルが見つからないか開けません");
            }
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }

        aggregate += i;

        addmoney.setText("");

        System.out.println(aggregate);
        String 表示 = Integer.toString(aggregate);
        nowmoney.setText(表示 + "円");
        try {
            File file = new File("/Users/uron/Desktop/nowmoney.txt");

            if (checkBeforeWritefile(file)) {
                FileWriter filewriter = new FileWriter(file, false);

                filewriter.write(aggregate);
                filewriter.close();
            } else {
                System.out.println("ファイルに書き込めません");
            }
        } catch (IOException e) {
            System.out.println(e);
        }

    }

    private static boolean checkBeforeWritefile(File file) {
        if (file.exists()) {
            if (file.isFile() && file.canWrite()) {
                return true;
            }
        }

        return false;
    }


    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO

  try {
            File file = new File("/Users/uron/Desktop/nowmoney.txt");

            if (checkBeforeReadfile(file)) {
                BufferedReader br = new BufferedReader(new FileReader(file));

                String str;
                while ((str = br.readLine()) != null) {
                    System.out.println(str);
                    nowmoney.setText(str + "円");
                }

                br.close();
            } else {
                System.out.println("ファイルが見つからないか開けません");
            }
        } catch (FileNotFoundException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }

 }

}


エラーは

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秒)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/01/04 18:01

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

    キャンセル

  • mit0223

    2017/01/04 21:43

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

    キャンセル

回答 3

+3

エラーコードを見る限り、いまいち原因を断定できないので 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()で実行例外が投げられたことです。

str = str.trim();


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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/04 21:59

    nowmoney.txtの中身は
    3
    です。

    キャンセル

  • 2017/01/05 07:36

    これにtrimって効きませんかね?

    キャンセル

  • 2017/01/05 07:47

    \u0020 がtrimの境目なんできくはずですね。

    まあ line.equals(line.trim()) で制御文字の有無は確認できるかと

    キャンセル

  • 2017/01/05 20:23

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

    キャンセル

checkベストアンサー

+1

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

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

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


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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13494questions

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

  • JavaFX

    394questions

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