回答編集履歴

4

String#replaceAll\(\)

2017/01/05 11:38

投稿

Zooey
Zooey

スコア55

test CHANGED
@@ -16,9 +16,13 @@
16
16
 
17
17
  ETX(0003)を除去するには、以下のコードでいいと思います
18
18
 
19
+ 追記: swordoneさんとentry01さんからご助言いただき、String#replaceAll()よりもString#trim()のほうが適切であると思ったので改変させていただきます
20
+
21
+ **なお今回のエラー原因は\u0003すなわちETX(END_OF_TEXT)が混入しInteger#parseInt()で実行例外が投げられたことです。**
22
+
19
23
  ```Java
20
24
 
21
- str = str.replaceAll("\3", "");
25
+ str = str.trim();
22
26
 
23
27
  ```
24
28
 
@@ -26,4 +30,12 @@
26
30
 
27
31
 
28
32
 
33
+ 今回の場合、数値としてあつかうのでString#trim()を使用し(先頭または)文末の\u0020以下の文字を削除しても問題ありませんでしたが
34
+
35
+
36
+
37
+ このさき文字列として扱う処理をプログラムする場合はString#trim()は文字列の先頭と行末にあって消す必要があるかないかにかかわらず空白文字もろとも消してしまうので注意してください。
38
+
39
+
40
+
29
41
  今回はもうすこし情報をまとめてから回答するべきでした...反省します。

3

具体的な解決策を示しました

2017/01/05 11:38

投稿

Zooey
Zooey

スコア55

test CHANGED
@@ -1 +1,29 @@
1
1
  エラーコードを見る限り、いまいち原因を断定できないので nowmoney.txt のデータをコピペしていただければ幸いです。こちらで「Caused by: java.lang.NumberFormatException: For input string: "3"」の3周辺の隠れているであろう文字コードがないか調べてみますと、やはり隠れていました、なにやら[EOF]に相当するものが隠れているようなのです。CP/M系かMS-DOSでないかぎり[EOF]なんてつけないと思うのですが...(わたしも知識不足です)とにかく原因はnowmoney.txtにあります。
2
+
3
+
4
+
5
+ 追記:
6
+
7
+ もうすこし詳しく調べてみました再現不可能文字を表示してくれるエディター(おなじみのmousepadです)で、エラーコードをコピペ(質問者様がjavaが吐き出したものをそのままコピペしてくれているのでうまい具合に見つけられます)して、表示した結果です
8
+
9
+ ![イメージ説明](231da6d83e79c0bd5e167120cf0d53c2.png)
10
+
11
+ この[0003]を調べてみますと、EOFではなく、ETX(END OF TEXT)を表すものみたいです。→[ソース](https://www.compart.com/en/unicode/U+0003)
12
+
13
+ このETXを除去する処理を加えるうまく行くのではないでしょうか。
14
+
15
+
16
+
17
+ ETX(0003)を除去するには、以下のコードでいいと思います
18
+
19
+ ```Java
20
+
21
+ str = str.replaceAll("\3", "");
22
+
23
+ ```
24
+
25
+ その場しのぎのコードかもしれません。とりあえず、これでエラーを回避してなぜnowmoney.txtにETXが紛れてしまったのか検証する必要がありますね。
26
+
27
+
28
+
29
+ 今回はもうすこし情報をまとめてから回答するべきでした...反省します。

2

エラーコードを読み違えてしまった\.\.\.恥ずかしい\.\.訂正させていただきます\.\.\.

2017/01/04 14:11

投稿

Zooey
Zooey

スコア55

test CHANGED
@@ -1,31 +1 @@
1
- エラーログをみと、以下2つ要因のようです。
2
-
3
-
4
-
5
- - JavaFX Application Thread による RuntimeException
6
-
7
- - NumberFormatException
8
-
9
-
10
-
11
- ひとつめは、JavaFXの仕様が原因です、FX8から外部スレッドからのGUI操作について厳しくなりました(詳しくは→[こちら](https://docs.oracle.com/javase/jp/8/javafx/interoperability-tutorial/concurrency.htm))
12
-
13
- 一番単純な解決策はGUIを操作する際(setText()など)Platform#runLater(Runnable) 使うことでしょう。AWT の EventQueue#invokeLater(Runnable) と同じ感覚です。これを使うことで、渡したRunnableをJavaFX Application Thread内で実行してくれます。
14
-
15
- Java 8 ならラムダ式の記述が使えますので、以下のようにできます。
16
-
17
- 例:)nowmoneyというラベルにsetText("")を外部スレッドから実行するとき
18
-
19
- ```Java
20
-
21
- Platform.runLater(() -> nowmoney.setText(""));
22
-
23
- ```
24
-
25
- Platformを使用する際は import javafx.application.Platform; してください。
26
-
27
-
28
-
29
- ふたつめは、よくあるエラーです。Integer#parseInt()はあまり融通が利かないメソッドで、数字に変換できない文字が含まれてるいるとすぐ実行例外を投げるワガママさんです。扱いには注意してください。
30
-
31
- しかしエラーコードを見る限り、いまいち原因を断定できないので nowmoney.txt のデータをコピペしていただければ幸いです。こちらで「Caused by: java.lang.NumberFormatException: For input string: "3"」の3周辺の隠れているであろう文字コードがないか調べてみますと、やはり隠れていました、なにやら[EOF]に相当するものが隠れているようなのです。CP/M系かMS-DOSでないかぎり[EOF]なんてつけないと思うのですが...(わたしも知識不足です)とにかく原因はnowmoney.txtにあります。
1
+ エラーコード見る限り、いまいち原因を断定できないので nowmoney.txt のデータをコピペしていただければ幸いです。こちらで「Caused by: java.lang.NumberFormatException: For input string: "3"」の3周辺の隠れているであろう文字コードがないか調べてますと、やはり隠れていました、なにやら[EOF]に相当するものが隠れているようなのです。CP/M系かMS-DOSでないかぎり[EOF]なんてつけないと思うのですが...(わたしも知識不足です)とにかく原因はnowmoney.txtにあります。

1

訂正

2017/01/04 12:07

投稿

Zooey
Zooey

スコア55

test CHANGED
@@ -26,10 +26,6 @@
26
26
 
27
27
 
28
28
 
29
- 類似質問がありましたので、そちらもご参考に→[こちら](https://teratail.com/questions/19097)
30
-
31
-
32
-
33
29
  ふたつめは、よくあるエラーです。Integer#parseInt()はあまり融通が利かないメソッドで、数字に変換できない文字が含まれてるいるとすぐ実行例外を投げるワガママさんです。扱いには注意してください。
34
30
 
35
31
  しかしエラーコードを見る限り、いまいち原因を断定できないので nowmoney.txt のデータをコピペしていただければ幸いです。こちらで「Caused by: java.lang.NumberFormatException: For input string: "3"」の3周辺の隠れているであろう文字コードがないか調べてみますと、やはり隠れていました、なにやら[EOF]に相当するものが隠れているようなのです。CP/M系かMS-DOSでないかぎり[EOF]なんてつけないと思うのですが...(わたしも知識不足です)とにかく原因はnowmoney.txtにあります。