java - 在数组开头获取 NullPointerException?

标签 java arrays nullpointerexception

我不确定为什么当我打印数组时,在数组的开头出现 nullPointerException(请参阅最后一个 println)。我以前见过 nullPointException,但它位于数组的末尾。我不明白为什么一开始就这样。另外,如果有人可以帮助摆脱异常,我将不胜感激。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) throws FileNotFoundException {

        File file = new File("Book.txt");
        Scanner sc = new Scanner(file);

        Book[] books = new Book[20];

        int x = 0;
        while(sc.hasNext()){
            int id, year;
            String name, author;

            //scan data for each book and create new book object
            id = Integer.valueOf(sc.next());
            year = Integer.valueOf(sc.nextLine().trim());
            name = sc.nextLine();
            author = sc.nextLine();

            books[x] = new Book(id, name, year, author);
            x++;
        }

        for(Book b : books){
            System.out.println(b.toString());
        }

    }

}

最佳答案

你的程序非常脆弱。它期望文件正好包含 20 本书:如果输入的书少于 20 本书,您将在打印循环中得到空指针异常;如果输入的书籍超过20本,则会在阅读循环中出现数组索引越界异常。

您应该使用简单的 for 更改 for-in 循环,并对从文件中读取的书籍数量添加限制,如下所示:

while(sc.hasNext() && x < 20) {
    ...
}
for (int i = 0 ; i != x ; i++) {
    System.out.println(books[i].toString());
}

按照上面的方式重组的程序就没有那么宽容了:当输入的书籍数量少于 20 本书时,它不会崩溃,而是会打印文件中尽可能多的条目。当文件中的书籍数量超出了预分配数组的容纳范围时,第 20 本书之后的书籍将被悄悄忽略。

关于java - 在数组开头获取 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15015248/

相关文章:

java - 读取excel文件时出现空指针异常

java - 如何解决生产系统上的内存不足错误

C 正确释放多维数组

python - 选择 numpy 数组中特定维度的索引

c - 通过指针算法迭代结构数组

java - 什么是NullPointerException,我该如何解决?

java - 由于 NullPointerException 导致的错误

Java 和 Mathematica 交互

java - 将 Java 数组中任意范围的元素设置为 null 的最快方法是什么?

java - 响应中没有 namespace 的 SOAP(Spring Boot)