2014-03-12 1 views
1

이것은 바보 같은 질문 일 수 있습니다. 그러나 여기에 널 포인터 예외가 발생하는 이유는 무엇입니까? 자바 애플릿의 타일 맵을 페인트하려고합니다. 방금 문제 영역을 붙여 넣었습니다. null 포인터 예외 2D 배열 목록 그리기를 사용하는 Java

private int[][] map;  
public void init() 
{ 
    int map[][]={ {0,0,0}, 
       {1,1,0}, 
       {0,0,0} }; 

} 
public void drawCaveTiles(Graphics g) 
{ 
    for(int i = 0; i <= 3; i++) 
    { 
     for(int j = 0; j <= 3; j++) 
     { 
      if(map[i][j] == 1) 
      { 
       g.drawImage(snow_brick, i*64, j*64, this); 
      } 
      if(map[i][j] == 0) 
      { 
       g.drawImage(black, i*64, j*64, this); 
      } 
     } 
    } 

} 

내가 방법 init()

map =new int[][] { {0,0,0}, 
      {1,1,0}, 
      {0,0,0} }; 
+0

null 포인터 예외를 수정 한 후에는 코드에 다른 논리적 인 문제가 있습니다. 'drawImage'에서 루프 변수'i'와'j'를 사용하는 방식이 잘못되었습니다. 'i'는 배열의 행이므로 y 좌표이고'j'는 열이므로 x 좌표입니다. 이미 행렬, x 좌표와 column, y 좌표의 차이를 전치 배열로 처리하면이 주석을 무시할 수있는 것으로 간주하십시오. – halex

답변

1
int map[][]={ {0,0,0}, 
       {1,1,0}, 
       {0,0,0} }; 

여기를 고정, 당신은 방법 init()에 로컬 새로운 맵을 생성하고 인스턴스 멤버 map 초기화되지 않습니다.

map ={ {0,0,0}, 
       {1,1,0}, 
       {0,0,0} }; 

로 변경을 그리고 당신은 drawCaveTiles() 메서드를 호출하기 전에 inti() 메소드를 호출해야합니다.

또는 정적 데이터이므로 그 선을 선언 장소로 옮기십시오.

1

init() 메서드에서 클래스 필드 map을 숨기고있는 것은 (사용자가 메서드 init()의 로컬 블록에서) 다시 선언하기 때문입니다.

또한 init() 메서드를 호출해야합니다. 그것은 당신의 생성자에서 호출해야 다음 init()

public class YourApplet { 
    public YourAppler() { 
     init(); 
    } 

    public void init() 
    { 
     map[][]={ {0,0,0}, 
       {1,1,0}, 
       {0,0,0} }; 
    } 
} 
1

지역 변수 int map[][]private int[][] map; 인스턴스 변수 그림자입니다. init() 메서드에서 새 로컬 int map을 만들지 마십시오. init() 메소드의 전역 맵 배열을 사용하면됩니다.

public void init() { 
    map={ {0,0,0}, {1,1,0}, {0,0,0} }; 
}