0

配列を出力するときに、配列の先頭(最後のprintlnを参照)でnullPointerExceptionが発生する理由がわかりません。以前に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());
        }

    }

}
4

1 に答える 1

4

あなたのプログラムはとても壊れやすいです。正確に20冊の本のファイルが必要です。入力された本が20冊未満の場合、印刷ループでnullポインター例外が発生します。20冊を超える本を入力すると、読み取りループで配列インデックスの範囲外の例外が発生します。

for-in単純なでループを変更しfor、次のようにファイルから読み取る本の数に制限を追加する必要があります。

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

上記のように再構築されたプログラムは、はるかに寛容ではありません。20冊未満の本が入力されたときにクラッシュするのではなく、ファイルにあるのと同じ数のエントリを印刷します。事前に割り当てられた配列に収まるよりも多くの本がファイルにある場合、20番目以降の本は静かに無視されます。

于 2013-02-22T01:21:34.830 に答える