[英]Throws Exception Error in Java
我正在开发一种库存程序,该程序处理从文件中读取项目列表,但遇到了一些麻烦。
到目前为止,这是我已经完成的代码:
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()方法上有一个。
我想念什么?
读取前请检查下一个值,以避免发生与为isbn
所做的异常,但没有为price
和copies
所做的异常。
样例代码:
if(fin.hasNextDouble()){
price = fin.nextDouble();
}
if(fin.hashNextInt()){
copies = fin.nextInt();
}
例如, Scanner#nextInt()方法抛出:
InputMismatchException
如果下一个标记与Integer正则表达式不匹配或超出范围 NoSuchElementException
如果输入已用尽 IllegalStateException
如果此扫描仪已关闭 您正在创建大小为15的数组,其中文件中只有10行会导致NullPointerException
。 在这种情况下,请使用List
。
您可以使用Java 7-try-with-resources语句来进行更好的资源管理,即使出现错误也是如此。
样例代码
public static BookDetail[] readInventory() throws Exception {
List<BookDetail> books = new ArrayList<BookDetail>();
java.io.File file = new java.io.File("../instr/prog4.dat");
try (Scanner fin = new Scanner(file)) {
String isbn;
double price = 0;
int copies = 0;
while (fin.hasNext()) {
isbn = fin.next();
if (fin.hasNextDouble()) {
price = fin.nextDouble();
}
if (fin.hasNextInt()) {
copies = fin.nextInt();
}
BookDetail book = new BookDetail(isbn, price, copies);
books.add(book);
}
}
return books.toArray(new BookDetail[books.size()]);
}
当前,您正在检查文件中是否包含更多数据,然后无论如何尝试读取15本书。 您的for循环从0到books.length-1,无论文件中是什么。
由于理论上您不知道文件中有多少本书, fin.hasNext
在阅读每本书之前,您需要检查fin.hasNext
。
因此,摆脱您的for循环,并用以下代码替换您的阅读代码:
int i = 0;
while (fin.hasNext()) {
// read book here and assign to books[i]
// increment i for next iteration
i++;
}
在阅读每本书之前,将检查while条件fin.hasNext()
。 当它返回false时,您将停止循环,而i
将是您阅读的书数。
请注意,您仍然假设每本书都有其所有字段。 如果文件中只有一本书,则您的代码仍然会崩溃。 但这可能是一件好事,因为实际上您没有办法从中恢复,并且大概可以假设您只会收到格式正确的输入。
我建议您使用异常处理。 我特别建议您尝试使用资源,因为您忘记了关闭正在使用的扫描仪。
您需要签入代码,以获取每本书所需的所有信息。 您不希望仅在书上仅包含部分信息,因为您无法收到该特定书上的其余数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.