2014-11-09 6 views
0

3 개의 문자열과 1 개의 부울의 합성 - 사용자 정의 유형의 배열을 채우려고합니다. 유형 이름은 PrinterType.이며이 3 개의 String 및 부울 값에 대해 SET 및 GET하는 메소드가 있습니다.사용자 정의 유형의 Java 배열

배열 채우기가 실행될 다른 클래스 파일에서이 파일을 사용하려고하지만 프로젝트를 실행할 때 java.lang.NullPointerException이 발생합니다.

이 문제는 문자열 문제입니다. 초기화되지 않았지만 사용자 정의 형식 배열의 문자열 필드를 초기화하는 방법을 알지 못합니다. 나는 누군가가 이것에 관해 나를 도울 수 있기를 바란다. 사용자 정의 유형 및 구현 클래스는 다음과 같습니다. 그런데

는, 구현 클래스의 라인에 오류 점 : Printers[i].setPersonality(aLineOfText[0].toString());

//implementing class ======================================= 
package MainPkg; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class ReadDefinitions 
{ 
final String sFileName = "C:/Definitions OEvP/Printers.txt"; 
private static int iNoOfLines; 
public PrinterType[] Printers; 


private int getNumberOfLines() throws IOException 
{ 
FileReader fr = new FileReader(sFileName); 
BufferedReader br = new BufferedReader(fr); 

iNoOfLines = 0; 

while (br.readLine() != null) 
{ 
    iNoOfLines++; 
} 

br.close(); 
fr.close(); 

return iNoOfLines; 
} 

public void setArray() throws IOException 
{ 
Printers = new PrinterType[this.getNumberOfLines()]; 
int i = 0; 

FileReader fr = new FileReader(sFileName); 
BufferedReader br = new BufferedReader(fr); 
String[] aLineOfText = {}; 

while (i != this.getNumberOfLines()) 
{ 
    aLineOfText = br.readLine().split(";"); 
    Printers[i].setPersonality(aLineOfText[0].toString()); 
    Printers[i].setProductNumber(aLineOfText[1].toString()); 
    Printers[i].setPL(aLineOfText[2].toString()); 

    if ("1" == aLineOfText[3].toString()) 
    { 
     Printers[i].setHipot(Boolean.TRUE); 
    } 
    else 
     { 
      Printers[i].setHipot(Boolean.FALSE); 
     } 

    i++; 
    aLineOfText = null; 
    System.gc(); 
} 
} 

} 


//user defined Class ====================================== 

package MainPkg; 

public class PrinterType 
{ 
private String sPersonality; 
private String sProductNumber; 
private String sPL; 
private Boolean bHipot; 

//constructor 
PrinterType() 
{ 
sPersonality = "test"; 
sProductNumber = "test"; 
sPL = "test"; 
} 

//printer information 
//set methods 
public void setPersonality(String localString) 
{ 
    sPersonality = localString; 
} 

public void setProductNumber(String localString) 
{ 
    sProductNumber = localString; 
} 

public void setPL(String localString) 
{ 
    sPL = localString; 
} 

public void setHipot(Boolean localBoolean) 
{ 
    bHipot = localBoolean; 
} 

//get methods 
public String getPersonality() 
{ 
    return sPersonality; 
} 

public String getProductNumber() 
{ 
    return sProductNumber; 
} 

public String getPL() 
{ 
    return sPL; 
} 

public Boolean getHipot() 
{ 
    return bHipot; 
} 
} 
+0

"프린터 [i] .setPersonality (aLineOfText [0] .toString());" 단지 "Printers [i] .setPersonality (aLineOfText [0]);"대신 " 왜냐하면 내가 당신의 코드를 볼 때 문자열 타입이기 때문에 그것에 toString()을 호출 할 필요가 없기 때문이다. – RE350

+0

안녕하세요 미친, 고마워, 나는 그걸 간과했다. 그래서 toString()을 사용하는 것이 좋습니다. 하지만 난 이미 코드를 수정하고 여전히 같은 오류가 발생했습니다. 그것은 자바에서 가능하지 않을 수 있습니까? – jude

+0

트릭은 오류 스택의 추적을 * 읽음으로써 오류의 출처를 파악하는 것입니다. 이 스택 추적이 없으면 알기보다는 추측해야합니다. –

답변

1

당신은 당신의 프린터 배열의 항목을 초기화되지 않습니다.

방금 ​​PrinterType의 null 항목 배열을 만들고 있습니다.

Printers = new PrinterType[this.getNumberOfLines()]; 

// Initialization 
for(int i = 0, l = this.getNumberOfLines(); i < l; i++) 
    Printers[i] = new PrinterType(); 
+0

감사합니다. Marcs! 큰 도움이되었습니다! – jude

+0

기쁘다.이 대답을 선택하고 질문을 닫는다. – Marcs

+0

2D 배열에서 동일한 문제가 발생했습니다. 사용자 정의 유형의 새로운 2 차원 배열을 인스턴스화했지만 ** new **로 초기화하지 않았습니다. 당신 덕분에 그것을 고치세요! – hungryWolf