2015-01-09 5 views
0

각 문자의 수를 계산하는 객체 클래스를 작성하고 테스트 코드를 실행할 때 "abc"가 전달되었을 때 널 포인터 예외를 표시합니다. 이유를 파악할 수 없습니다 . 테스트 코드는 오류가 없지만 객체 클래스에는 실수가 있습니다.이 특정 널 포인터 예외를 해결하는 방법

public class LetterInventory { 

    private static final int COUNTER = 26; 
    private int size = 0; 
    private int[] inventory; 

    public LetterInventory() { 
    inventory = new int [COUNTER]; 
} 
    public LetterInventory (String data) { 
     data = data.toLowerCase(); 
     for(int i = 0; i < data.length(); i++) { 
     int charPosition = data.charAt(i) - 'a'; 
     if(charPosition >= 0 && charPosition < COUNTER) { 
      inventory[charPosition]++; 
      size++; 
     } 
     } 
    } 
+0

수정 프로그램은 모든 NPE에 대해 동일합니다 : 널 (null) 무엇을 파악하고 null이 아닌 참조에 할당합니다. 스택 추적은 파일을 생성 한 파일의 행 번호를 알려줍니다. 그게 충분히 좋은 힌트가 아닐까요? – duffymo

+0

NPE는 어디에 있습니까? –

+0

글쎄, 하나의 생성자에서'inventory'를 초기화하고 다른 생성자에서 사용하는 것은 그리 똑똑하지 않습니다. 둘 다 호출 할 수 없으므로 아무 것도 세지 못하거나'인벤토리 '가'null'로 남습니다. – Tom

답변

2

두 번째 생성자에서 배열을 초기화하지 않았습니다.

public LetterInventory(String data) { 
    inventory = new int[COUNTER]; // <= initialization was missing 
    data = data.toLowerCase(); 
    for (int i = 0; i < data.length(); i++) { 
     int charPosition = data.charAt(i) - 'a'; 
     if (charPosition >= 0 && charPosition < COUNTER) { 
      inventory[charPosition]++; 
      size++; 
     } 
    } 
} 
+0

두 장소에서 초기화하는 대신 다른 생성자 인'this();'를 호출하십시오. [DRY] (http://en.m.wikipedia.org/wiki/Don%27t_repeat_yourself)를 참조하십시오. – Bohemian

+0

하지만, 어떻게 그리고 어디에서 사용합니까? –

0

그래서 여기 당신이 가서 언급을 허용하고 있지 않다 :

public LetterInventory(String data) { 
    this(); 
    //inventory = new int[COUNTER]; // <= initialization was missing 

    data = data.toLowerCase(); 
    for (int i = 0; i < data.length(); i++) { 
     int charPosition = data.charAt(i) - 'a'; 
     if (charPosition >= 0 && charPosition < COUNTER) { 
     inventory[charPosition]++; 
     size++; 
    } 
} 
관련 문제