gpt4 book ai didi

java - Java 抛出异常错误

转载 作者:行者123 更新时间:2023-11-30 03:48:56 25 4
gpt4 key购买 nike

我正在开发一种库存程序,该程序处理从文件中读取项目列表的操作,但我遇到了一些麻烦。

这是我迄今为止完成的代码:

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 编程类(class)的内存,我们应该在 main 方法和处理文件的任何其他方法中抛出异常,因此在本例中,我在 main 方法上抛出异常,在 readInventory() 方法上抛出另一个异常。

我错过了什么?

最佳答案

在阅读之前检查下一个值,以避免出现此类异常,就像您对 isbn 所做的那样,但对 pricecopies 则不然。

示例代码:

 if(fin.hasNextDouble()){
price = fin.nextDouble();
}
if(fin.hashNextInt()){
copies = fin.nextInt();
}

例如Scanner#nextInt()方法抛出:

  • InputMismatchException - 如果下一个标记与 Integer 正则表达式不匹配,或者超出范围
  • NoSuchElementException - 如果输入已用尽
  • IllegalStateException - 如果此扫描仪已关闭
<小时/>

您正在创建大小为 15 的数组,其中文件中只有 10 行导致 NullPointerException。使用List在这种情况下。

您可以使用Java 7 - The try-with-resources Statement即使出现错误也能实现更好的资源管理。

示例代码

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()]);
}

关于java - Java 抛出异常错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24900981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com