2013-02-22 4 views
0

왜 배열을 인쇄 할 때 nullPointerException (마지막 println 참조)이 시작되는지 알 수 없습니다. 전에 nullPointException을 본 적이 있지만 배열의 끝에있었습니다. 나는 그것이 초기에 있었던 이유를 알지 못한다. 게다가 누군가가 예외를 없애는 데 도움이된다면 고맙겠습니다.배열 시작 부분에서 NullPointerException을 가져 오는 중입니까?

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

    } 

} 
+0

처음과 끝이 아니라 어떻게 알 수 있습니까? 20 권 미만의 책을 입력하면 프로그램이 NPE로 중단되고, 20 권이 넘는 책이 입력되면 Index Out of Bound로 충돌합니다. – dasblinkenlight

+1

NPE가 없으면 정확히 어떤 줄을 나타내는지, null인지는 알 수 없습니다. 데이터에 대한 가정이나 디버거를 사용하기 위해 printlns를 두는 것은 어떻습니까? –

답변

4

프로그램이 매우 깨지기 쉽습니다. 정확히 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 번째 이후의 책은 조용히 무시됩니다.

+0

감사합니다. 나는 몇 달 동안 자바에서 프로그래밍하지 않았다. 나는 지금 매우 녹슬다. 나는 지금 녹을 깨는 방법을 모른다 :( –

관련 문제