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

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

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

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

Q&A

解決済

3回答

3115閲覧

javaのファイルの入出力における引数指定

Tsubasa73

総合スコア7

Java

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

0グッド

1クリップ

投稿2022/09/04 09:42

編集2022/09/04 09:44

前提

javaでファイルに保存された数の合計を計算するシステムを作っています。
一行ごとに整数かつテキスト形式で保存されていて、そのファイルを読み込み、引数に指定して合計を求めたい。
例えば、test.textのファイルに以下の数字が入力されているとする。
この時、java sample test.txtとファイル名を引数に指定し、実行すると、合計が出力されるようになってほしい(合計50)。

test.txt

1
9
15
25

実現したいこと

・一行ごとに整数かつテキスト形式で保存されていて、そのファイルを読み込み、引数に指定して合計を求めたい。
・エラー対処したい。

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

Exception in thread "main" java.lang.NumberFormatException: Cannot parse null string at java.base/java.lang.Integer.parseInt(Integer.java:630) at java.base/java.lang.Integer.parseInt(Integer.java:784) at sample.main(sample.java:13)

該当のソースコード

java

1import java.io.*; 2public class sample{ 3 public static void main(String args[]){ 4 try{ 5 String fileName=args[0]; 6 File file=new File(fileName); 7 FileReader fir = new FileReader(file); 8 BufferedReader brFile=new BufferedReader(fir); 9 int count=0; 10 11 while(true){ 12 String line=brFile.readLine(); 13 int lineInt=Integer.parseInt(line); 14 if(line==null){ 15 break; 16 } 17 count=count+lineInt; 18 } 19 fir.close(); 20 } 21 catch(IOException e){ 22 System.out.println("指定したファイルが見つかりません。"); 23 } 24 } 25}

試したこと

なぜできないかわからないため教えていただきたいです。。

補足情報(FW/ツールのバージョンなど)

ファイルの入出力に関して身についていないと思われるため、何か参考になる文献があれば、ご教授いただきたいです。お願いします。

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

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

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

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

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

dodox86

2022/09/04 10:14

> なぜできないかわからないため教えていただきたいです。。 Eclipseなど、デバッガーの機能があるものでステップ実行して1行1行の動作を確認しましょう。
guest

回答3

0

エラーの通りです。

java.lang.NumberFormatException: Cannot parse null string

nullはパース(解析)出来ない。
現状パースしてからnullかどうかを見ていますので、
nullが想定されるのならnullかどうか見てからパースするように修正するだけです。

投稿2022/09/04 09:56

m.ts10806

総合スコア80842

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

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

0

line が null だったらループを終わる…より先に parseInt してるからです。

投稿2022/09/05 17:48

jimbe

総合スコア12612

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

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

0

ベストアンサー

まず、エラーメッセージは良く読むようにしてください。
エラーメッセージは何も怖くありませんよ。
エラーメッセージは簡単に言えばコンパイラとかそういうのからの『返答』です。
「なあ、これって〇〇じゃね?」とかみたいな感じです。

一応答えはm.ts10806さんの仰ると通りですが、書いておきます。

error

1Exception in thread "main" java.lang.NumberFormatException: Cannot parse null string 2 at java.base/java.lang.Integer.parseInt(Integer.java:630) 3 at java.base/java.lang.Integer.parseInt(Integer.java:784) 4 at sample.main(sample.java:13) 5 6訳: 7"main"スレッドからjava.lang.NumberFormatExceptionという例外が飛んできています: 空文字(null string)はパース(解釈)できません(泣 8場所は Smaple.javaの13行目(sample.mainメソッド)で、 9その中で使われているjava.base/java.lang.Integer.parseIntメソッド 10です。

これは例外と言います。例外については入門書かなんかで調べてください。
javaパッケージのlangパッケージのNumberFormatExceptionが飛んできていますね。
このjava.lang.NumberFormatExceptionを公式ドキュメントで調べましょう。
Number(数字)Format(書式)Exception(例外) … ここを見ると、

アプリケーションが文字列を数値型に変換しようとしたとき、文字列の形式が正しくない場合にスローされます。

とありますね。つまり文字列 → 整数 に変換しようとしたけど、変換できなかったために投げられた例外ってことです。そもそも変換できないのでこれ以上続行できないので例外が投げられています。

"133" とかのような数字に変換できる場合はそのまま変換されて a = 133 とかになります。ですがこれが"hello"とか何も書かれていない、つまり空の文字列だったらどうでしょうか。変換できませんよね。なので『おーい、変換できんかったぞ~』っと言われているだけです。

ということはまずやるべきことは「デバッグ」ですね。
いわゆるprintfデバッグ(JavaだとSystem.out.printlnメソッドとかでデバッグすること)で行うか、Javaで使える出デバッガがあるならそれを使ってデバッグします。

デバッグ方法はいろいろあるので調べてください。

もしprintfデバッグでやるなら、while文内にある処理String line=brFile.readLine();の直後あたりに
System.out.println( "line = " + line + ";" );のような感じで『lineの値をチェックしてみる』とかでしょうか。
多分、(例外メッセージ内でも書かれているように)「空の文字列」になっている可能性があります。

もし実際に空の文字列となっている場合があるのなら、『空の文字列でなければ例外が飛んでこない』ので『空の文字列なら処理しない(= continueとかでスキップするとか)』とかのような処理を設ければ回避可能かと思いますよ。

投稿2022/09/04 12:30

BeatStar

総合スコア4958

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問