【问题标题】:Getting NullPointerException at the beginning of an array?在数组的开头获取 NullPointerException?
【发布时间】:2013-02-22 01:15:10
【问题描述】:

我不确定为什么当我打印出来时,我的数组开头会出现 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 本书,程序将崩溃并出现 NPE,如果输入的书籍超过 20 本书,程序将出现索引超出范围。
  • 告诉我们有一个 NPE w/o 准确地指示哪一行以及什么是空的是没有意义的。放入一些 println 来检查您对数据的假设或使用调试器怎么样?

标签: java arrays nullpointerexception


【解决方案1】:

您的程序非常脆弱。它期望文件正好有 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 编程了。我现在非常生锈。我现在不知道如何打破铁锈:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多