2012-04-03 3 views
1

제가 상기 코드 getNumber에NullPointerException이 동안

public static void main(String[] args) throws IOException { 
      length=getNumber("Enter the length of the field: "); 
      breadth=getNumber("Enter the breadth of the filed: "); 
      node n = new node(); 
      node [][] field = new node[length][breadth]; 
      for(i=0;i<=length;i++){ 
       for(j=0;j<=breadth;j++){ 
        F =getNumber("Enter the F value"); 
        field[i][j].setF(F); 
        System.out.println(" "+field[i][j].getF(F); 
       } 
      } 

    } 

다음과 같이 "노드"객체들의 2 차원 어레이를 만들려고하면 나 인쇄 허용 상기 함수

public class node { 
public int F; 
public int G; 
public int H; 
public boolean isVisited; 
public boolean isCurrent; 
public void node(int F,int G,int H,boolean isVisited, boolean isCurrent){ 
    this.F=F; 
    this.G=G; 
    this.H=H; 
    this.isVisited=isVisited; 
    this.isCurrent=isCurrent; 

} 
public int getF() { 
    return G+H; 
} 
public void setF(int f) { 
    F = f; 
} 
public int getG() { 
    return G; 
} 
public void setG(int g) { 
    G = g; 
} 
public int getH() { 
    return H; 
} 
public void setH(int h) { 
    H = h; 
} 
public boolean isVisited() { 
    return isVisited; 
} 
public void setVisited(boolean isVisited) { 
    this.isVisited = isVisited; 
} 
public boolean isCurrent() { 
    return isCurrent; 
} 
public void setCurrent(boolean isCurrent) { 
    this.isCurrent = isCurrent; 
} 

}

내가하고 싶은 모든이, 저장/각각 F, G, H 등의 액세스 다양한 값 : 숫자 여기 내 노드 클래스 그러나 노드 객체의 문제는 내가 받고있다 field[i][j].setF(F); 나는 어디서 잘못 가고 있는지 알지 못한다. 도움이 필요하다.

답변

2

배열을 초기화했지만 채우지 않았습니다. 당신이 배열에 액세스하는

field[i][j]

을 수행 할 때

field[i][j].setF(F);

;

이 라인을 고려 즉 그 위치에있는 어레이에있는 것을 가져 오는 것. 배열에 아무 것도 넣지 않았으므로 null이됩니다. 그러나 즉시 setF에 전화하려고합니다.

나는 당신이 루프 밖에서

node n = new node();

을 발견했습니다. 아마 루프에서 그렇게하기를 원할 것입니다.

node n = new node(); 
n.setF(F); 
field[i][j] = n; 

이 코드는 node 인스턴스를 만들고 그 위에 값을 설정하고, 지정된 위치에 배열에 넣는다. 좀 더 멋진 방법은 다른 방법으로

node n = field[i][j]; 
if (n == null) { // initialize n at the position if it doesn't exist 
    n = new node(); 
    field[i][j] = n; 
} 

field[i][j].setF(f); 

처럼 뭔가를 할 수, 당신은 배열을 통해 루프 수 및 배열을 초기화 직후, 각 위치에서 새로운 node을 둘 것입니다.

마지막으로 자바 표준 연습에서는 클래스 이름을 대문자로 시작하는 것입니다. nodeNode이어야합니다.

+0

나는 그것으로 채우는가?그 객체의 배열 (나는 그것에 매우 정성스럽게 초보자이다) – md1hunox

+0

@vineetrok 내가 정련하는 나의 대답의 바닥 부분을 조사한다. – hvgotcodes

+0

고마워, 지금 일하고 – md1hunox

0

이 시도 :

for(i=0;i<=length;i++){ 
    for(j=0;j<=breadth;j++){ 
     F =getNumber("Enter the F value"); 

     node tmp = new node(); 
     tmp.setF(F); 

     field[i][j] = tmp; 
     System.out.println(" "+field[i][j].getF(F); 
    } 
} 

PS를 자바 클래스 이름은 대문자로 시작하고 낙타 표기법에 작성해야 것이 관례

[편집] 이 (당신의 GET/setf의 조심) 함수는 동일한 변수에서 작동하지 않으므로

이 질문에 관련이 없지만이 document을 통해 읽고 자한다면 java의 이름 지정 규칙에 대해 배우고 전자 코드를 작성하는 데 도움이 될 것입니다. 읽을 asier

+0

이 필드를 사용하여 get [F] = 0 – md1hunox

+0

"노드"제대로 초기화되지 않았습니다. 생성자가없고 기본 G 및 H가 0으로 유지됩니다. setF()는 실제로 F를 설정하지만 getF()는 G + H를 반환하기 때문에 코드가 다소 혼란 스럽습니다. 또한 public void node()는 생성자가 아닙니다. 생성자는 public node()가됩니다. – Grims

+0

THAT! 지금 일하고있어! 감사! – md1hunox

관련 문제