2013-03-19 6 views
0

객체 배열 또는 객체 배열을 사용하여 문제가 발생했습니다.이 문제는 매끄러운 문제와 관련이 없습니다. init 메소드가 실행되고 블록 부분에 도착할 때마다 널 포인터 예외가 발생합니다. 또한 문제가 저에게 Block 객체를 올바르게 선언하지 않는다고 확신합니다. 이 일에 정말로 도움이 필요해.객체 배열의 배열을 선언하는 데 문제가 발생했습니다.

import org.newdawn.slick.*; 
import org.newdawn.slick.state.*; 

public class Stages extends BasicGameState { 
    LevelInfo level = new LevelInfo(1); 
    Block block[][]; 
    public Stages(int state) { 

    } 
    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException { 
     level.init(); 
     for(int i = 0; i < 13;i++) { 
      for(int j = 0; j < 13;j++) { 
       block[i][j] = new Block(level.type[i][j]); 
      } 
     } 

    } 
    public void render(GameContainer gc, StateBasedGame sbg,Graphics g) throws SlickException { 
     for(int i = 0; i < 13;i++) { 
      for(int j = 0; j < 13;j++) { 
       g.drawImage(block[i][j].image,j*60,i*60); 
      } 
     } 
    } 
    public void update(GameContainer gc, StateBasedGame sbg,int delta) throws SlickException { 

    } 
    public int getID() { 
     return 2; 
    } 
} 

답변

1

그런 다음 당신이 여기

block[i][j] = new Block(level.type[i][j]); 

변수를 할당을 시도합니다 NPE의 결과로, 당신의 2Dblock 배열을 인스턴스화 결코 당신은 따라서 귀하의 배열을 선언 할 수 :

private Block block[][] = new Block[13][13]; 
+0

감사합니다. 당신은 겸손한 태도없이 저에게 응답 한 유일한 사람입니다. –

3

당신을 ' block 자체는 초기화하지 않습니다. 항상 null의 값을 갖습니다. 당신이 필요합니다

block = new Block[13][13]; 
당신의 init 방법

, 또는 생성자에서, 또는 변수 선언에서.

다른 음의 몇 :

  • 당신이 WIDTH의 상수를 가질 수 당신은 거의 확실 ... 당신은 아마 꽤 자주 숫자 13을 하드 코딩하지 않도록해야합니다 private
  • 당신의 변수를 확인해야하고 HEIGHT 아마도? 함께 변수에 대한 모든 유형의 정보를 유지

    private Block[][] block; 
    

    :

  • 이 같은 변수를 선언하는 것이 더 관용적 인 것이다. "변수 이름 뒤의 배열 부분"은 Java가 도입되었을 때 기존의 C/C++ 프로그래머를 행복하게 만드는 데 정말로있었습니다.

관련 문제