1. ホーム
  2. java

[解決済み】EOFException - どのように処理するのですか?

2022-01-27 03:50:50

質問

を参考にした初心者Javaプログラマーです。 Javaチュートリアル .

の簡単なJavaプログラムを使っています。 Javaチュートリアル 's データストリームのページ が表示され続け、実行時に EOFException . 読者は最終的にファイルの最後に来なければならないので、これは正常なことなのか疑問に思っていました。

import java.io.*;

public class DataStreams {
    static final String dataFile = "F://Java//DataStreams//invoicedata.txt";

    static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 };
    static final int[] units = { 12, 8, 13, 29, 50 };
    static final String[] descs = {
        "Java T-shirt",
        "Java Mug",
        "Duke Juggling Dolls",
        "Java Pin",
        "Java Key Chain"
    };
    public static void main(String args[]) {
        try {
            DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));

            for (int i = 0; i < prices.length; i ++) {
                out.writeDouble(prices[i]);
                out.writeInt(units[i]);
                out.writeUTF(descs[i]);
            }

            out.close(); 

        } catch(IOException e){
            e.printStackTrace(); // used to be System.err.println();
        }

        double price;
        int unit;
        String desc;
        double total = 0.0;

        try {
            DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));

            while (true) {
                price = in.readDouble();
                unit = in.readInt();
                desc = in.readUTF();
                System.out.format("You ordered %d" + " units of %s at $%.2f%n",
                unit, desc, price);
                total += unit * price;
            }
        } catch(IOException e) {
            e.printStackTrace(); 
        }

        System.out.format("Your total is %f.%n" , total);
    }
}

コンパイルは問題ないのですが、出力が

You ordered 12 units of Java T-shirt at $19.99
You ordered 8 units of Java Mug at $9.99
You ordered 13 units of Duke Juggling Dolls at $15.99
You ordered 29 units of Java Pin at $3.99
You ordered 50 units of Java Key Chain at $4.99
java.io.EOFException
        at java.io.DataInputStream.readFully(Unknown Source)
        at java.io.DataInputStream.readLong(Unknown Source)
        at java.io.DataInputStream.readDouble(Unknown Source)
        at DataStreams.main(DataStreams.java:39)
Your total is 892.880000.

から Javaチュートリアル 's データストリームのページ と書かれています。

<ブロッククオート

DataStreams は、ファイル終端条件を検出するために EOFException 無効な戻り値をテストするのではありません。DataInputメソッドの実装はすべて戻り値の代わりにEOFExceptionを使用します.

ということは EOFException は正常なので、キャッチするだけで処理しないのは、ファイルの末尾に到達したということでいいのでしょうか?

もし、処理した方が良いということであれば、どのようにすれば良いのかアドバイスをお願いします。

EDIT

ご指摘の内容から、修正したのは in.available() > 0 に対して while ループ条件

あるいは、例外の処理を何もしないのも、問題ないからです。

どのように解決するのですか?

ファイルからの読み込み中、ループを終了していません。そのため、すべての値を読み込んで 正しく は、次の行の読み込みの繰り返しでEOFExceptionをスローします。

 price = in.readDouble();

ドキュメントを読むと、こう書いてあります。

を投げます。

EOFException - この入力ストリームが8バイトを読み込む前に終了した場合。

IOException - ストリームが閉じられ、含まれる入力ストリームが閉じた後の読み込みをサポートしない、または別のI/Oエラーが発生しました。

whileループに適切な終了条件を設定し、問題を解決してください。

     while(in.available() > 0)  <--- if there are still bytes to read