私はJava チュートリアルに従って初心者の Java プログラマーです。
Java チュートリアルのData Streams Pageから単純な Java プログラムを使用していますが、実行時に表示され続けます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 チュートリアルのData Streams Pageには、次のように書かれています。
DataStreams は、無効な戻り値をテストする代わりに、EOFExceptionをキャッチすることによってファイルの終わりの状態を検出することに注意してください。DataInput メソッドのすべての実装は、戻り値の代わりに EOFException を使用します。
では、これは、キャッチするEOFException
のが正常なので、キャッチして処理しなくても問題ない、つまりファイルの終わりに到達したということですか?
それを処理する必要があるということであれば、どうすればよいかアドバイスをお願いします。
編集
in.available() > 0
提案から、 forwhile
ループ条件を使用して修正しました。
または、それで問題ないので、例外を処理するために何もできませんでした。