【发布时间】:2014-07-23 02:38:41
【问题描述】:
我正在开发一种库存程序,该程序处理从文件中读取项目列表,但遇到了一些麻烦。
这是我到目前为止完成的代码:
import java.util.Scanner;
import java.io.*;
public class Store {
public static void main(String[] args) throws Exception {
Book[] books = readInventory();
for (Book book : books) {
System.out.printf("ISBN: %s, Price: %f, Copies: %d%n",
book.getISBN(), book.getPrice(), book.getCopies());
}
}
public static Book[] readInventory() throws Exception {
Book[] books = new Book[15];
java.io.File file = new java.io.File("../instr/prog4.dat");
Scanner fin = new Scanner(file);
String isbn;
double price;
int copies;
int i = 0;
while (fin.hasNext()) {
isbn = fin.next();
if (fin.hasNextDouble()); {
price = fin.nextDouble();
}
if (fin.hasNextInt()); {
copies = fin.nextInt();
}
Book book = new Book(isbn, price, copies);
books[i] = book;
i++;
}
fin.close();
return books;
}
public static void printInfo(Book[] books) {
for(int x=0; x<books.length; x++) {
System.out.println("ISBN: " + books[x].getISBN() + "\n Price: " +
books[x].getPrice() + "\n Copies: " + books[x].getCopies());
}
}
}
class Book {
private String isbn;
private double price;
private int copies;
public Book(String isbnNum, double priceOfBook, int copiesInStock) {
isbn = isbnNum;
price = priceOfBook;
copies = copiesInStock;
}
public String getISBN() {
return isbn;
}
public double getPrice() {
return price;
}
public int getCopies() {
return copies;
}
public void setISBN(String isbn) {
this.isbn = isbn;
}
public void setPrice(double price) {
this.price = price;
}
public void setCopies(int copies) {
this.copies = copies;
}
@Override
public String toString() {
return String.format("ISBN: %s, Price: %f, Copies: %d%n",
this.getISBN(), this.getPrice(), this.getCopies());
}
}
程序可以正常编译,但是当我运行程序时出现错误
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:855)
at java.util.Scanner.next(Scanner.java:1364)
at Store.readInventory(Store.java:31)
at Store.main(Store.java:13)
这是我应该使用的文件的内容:
1234567 31.67 0
1234444 98.50 4
1235555 27.89 2
1235566 102.39 6
1240000 75.65 4
1247761 19.95 12
1248898 155.91 0
1356114 6.95 17
1698304 45.95 3
281982X 31.90 5
我一直在查看我最近编写的另一个程序,该程序处理读取文件,看看我在相同类型的地方抛出异常,看起来我是(在该程序中处理文件的所有内容都在main 方法,所以这是唯一一个抛出异常的方法)。根据我对早期 Java 编程类的记忆,我们应该在 main 方法和任何其他处理文件的方法中抛出异常,所以在这种情况下,我在 main 方法上设置了一个,在 readInventory() 方法上设置了另一个。
我错过了什么?
【问题讨论】:
-
您正在检查
fin.hasNext(),它告诉您文件中至少还剩下 一个 东西,但是您假设文件中有 15 本书。您的文件是否真的包含您要读取的所有数据? -
部分说明是创建一个 Book 类型的数组,该数组最多可容纳 15 个书籍对象,但该文件实际上只包含 10 行(每行包含 ISBN、价格和金额有货)。