Я начинающий Java-программист, следуя java tutorials.
Я использую простую программу Java из учебных пособий 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-уроки Страница потоков данных, it говорит:
Обратите внимание, что DataStreams обнаруживает условие конца файла, перехватывая EOFException вместо проверки на недопустимое возвращаемое значение. Все реализации методов DataInput используют EOFException вместо возвращаемых значений.
Итак, означает ли это, что catching EOFException
является нормальным, поэтому просто поймать его и не обрабатывать, это хорошо, что означает, что конец файла достигнут?
Если это означает, что я должен это обработать, пожалуйста, сообщите мне, как это сделать.
ИЗМЕНИТЬ
Из предложений я исправил его, используя in.available() > 0
для условия цикла while
.
Или я не мог ничего сделать, чтобы обрабатывать исключение, потому что это нормально.