2013-08-22 3 views
1

다음 코드는 텍스트 파일을 열고 내용을 쉼표를 구분 기호로 사용하여 토큰으로 나눕니다. 나는 이것과 비슷한 코드를 사용했지만 괜찮 았지만 어떤 이유로, 이것은 "myItems [counter] .name = myTokens [counter];에 NullPointerException을 던지고있다."토큰 Null 포인터 예외

public static serial[] getSerials(String fName) throws Exception { 
    String total = null; 
    BufferedReader lineReader = null; 
    lineReader = new BufferedReader(new FileReader(fName)); 
    while ((lineReader.readLine()) != null) { 
     total = total + lineReader.readLine() + ","; 
    } //end while 
    String[] myTokens = total.split(","); /*break the string csv tokens*/ 
    /*Put together the serial objects*/ 
    serial mySerials[] = new serial[myTokens.length]; 
    int counter = 0; 
    while (counter < myTokens.length) { 
     mySerials[counter].name = myTokens[counter]; 
     counter++; 
     mySerials[counter - 1].onlineISSN = myTokens[counter]; 
     counter++; 
    } 
    return mySerials; 
} //end getSerials() 
+0

총 초기화를 시도 했습니까? like String total = ""; 그리고 StringBuilder를 사용하여 문자열을 '빌드'할 수 있습니다. – Fernando

+0

'myItems [counter] .name = myTokens [counter];'-> 코드에 다음과 같은 행이 없습니다. – BackSlash

+0

Java 명명 규칙을 사용하십시오! 클래스 이름은 대문자로 시작합니다. – ppeterka

답변

5

당신은 배열을 초기화 한

serial mySerials[] = new serial[myTokens.length]; 

아닌 요소 당신은 회원들에게 접근하기 전에 먼저 요소를 초기화해야

mySerials[counter].name // will throw NPE 

mySerials[counter] = new serial(/* something possibly */); 
1

당신에게 너를 만들었 어. 그는 배열하지만, ​​채워지지는 않습니다. 따라서 mySerials[counter]은 null이지만 역 참조를합니다. 당신의 serial 클래스를 가정 것은 생성하라 생성자가 ...

mySerials[counter] = new serial(myTokens[counter]); 

: 난 당신이 뭔가를하려는 생각합니다. 또는 더 나은, 두 부분을 처리하기 : 만 mySerials의 다른 모든 요소가 왜 그냥 대신 List<serial>을 만들고 해당 항목을 추가하지 않습니다 ... 채워집니다

mySerials[counter] = new serial(myTokens[counter], myTokens[counter + 1]); 
counter += 2; 

주?

또한 serial이라는 이름은 클래스에 대한 Java 명명 규칙을 위반합니다. 가능한 한 일찍 이름 지정하는 것이 좋은 습관에 들어갈 가치가 있습니다.

while (counter < myTokens.length) {  
    mySerials[counter] = new Serial(); 
    // ... 
0

당신은 mySerialsSerial 객체를 실체화 할 필요가

mySerials[counter].name = myTokens[counter]; 

그냥 바로 위에, 당신은 Searil의 배열을 초기화했지만, 아직 요소가 없습니다

serial mySerials[] = new serial[myTokens.length]; 
루프 내에서 사용자가 액세스하려고 할 때 기본적으로 배열의 기본 값을 받아 귀하의 경우는 null 될 것입니다, 당신은 null에 수행 어떤 동작을 방지하기 위해, 당신에게 NPE을 줄 것으로

그래서 mySerials[0] 당신에게 null를 반환합니다 이 값은 생성/초기화시에 array의 값을 가져야합니다. 사용하려고하면 바로 위의 값을 가져야합니다.

0
while (counter < myTokens.length) { 
    mySerials[counter] = new serial(); 
    mySerials[counter].name = myTokens[counter]; 
    counter++; 
    mySerials[counter - 1].onlineISSN = myTokens[counter]; 
    counter++; 
} 
0

문제는 라인이다 :