2013-04-05 3 views
4

이 질문에 대한 연구를 이미 마쳤으며 스스로 해결하려했지만 운이 없었습니다. 그래서 나는 그것을 묻기로 결정했다.getter를 호출 할 때 NullPointerException이 발생했습니다.

기본 정보 :

는 두 개의 클래스가 있습니다. FBClientState. FBClient에는 고정 유형 변수 인 fbcStateManager 인스턴스가 있습니다.이 인스턴스에는 State 항목, 일부 상수 및 2 개의 getter로 작업 할 수있는 몇 가지 메소드가 있습니다. State에서 BufferedImage을 초기화하려고합니다.

public class FBClient 
{ 
    //Static 
    public static FBClient fbc; 

    //In init method 
    private StateManager stateManager; 

    //Constants 
    private final int INIT_FRAME_WIDTH = 320, INIT_FRAME_HEIGHT = (INIT_FRAME_WIDTH/4) * 3, SCALE = 3, FRAME_WIDTH = INIT_FRAME_WIDTH * SCALE, FRAME_HEIGHT = INIT_FRAME_HEIGHT * SCALE; 

    public static void main(String[] args) 
    { 
     try 
     { 
      //First call in exception chain: 
      fbc = new FBClient(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 

    private FBClient() 
     throws IOException 
    { 
     //Second call in exception chain: 
     init(); 
    } 

    private void init() 
     throws IOException 
    { 
     stateManager = new StateManager(); 
     //Third call in exception chain: 
     stateManager.addState(new MainMenu((byte) 0, "Main Menu")); //MainMenu is the subclass of State, and the constructor just calls "super(0, "Main Menu")" 
    } 

    public int getFRAME_HEIGHT() 
    { 
     return FRAME_HEIGHT; 
    } 

    public int getFRAME_WIDTH() 
    { 
     return FRAME_WIDTH; 
    } 
} 

public abstract class State 
{ 
    protected final byte ID; 
    protected final String NAME; 
    protected final BufferedImage SCREEN; 
    protected final Graphics2D GRAPHICS; 

    public State(byte id, String name) 
    { 
     this.ID = id; 
     this.NAME = name; 
     //Exception cause: 
     this.SCREEN = new BufferedImage(FBClient.fbc.getFRAME_WIDTH(), FBClient.fbc.getFRAME_HEIGHT(), BufferedImage.TYPE_INT_RGB); 
     this.GRAPHICS = SCREEN.createGraphics(); 
    } 
} 

더 많은 정보 : 내가 BufferedImage의 초기화에 리터럴을 넣으면

가 작동합니다.

State 클래스에서 두 개의 변수를 초기화하고 리터럴을 할당하고 해당 변수를 초기화에 넣으면 작동합니다.

변수에 리터럴을 할당하는 대신 FBClient.fbc.getFRAME_WIDTH()FBClient.fbc.getFRAME_HEIGHT()을 할당하면 NullPointerException이 발생합니다. 나는 System.out.println(getFRAME_WIDTH + " : " + getFRAME_HEIGHT) 클래스 FBClient에를 한 경우

는 제대로 출력합니다,하지만 난 State 클래스 (오프 물론 전 FBClient.fbc. 추가)에서 할 경우, 그것은 NullPointerException가 발생합니다.

내가 FRAME_WIDTHFRAME_HEIGHT 상수 public을하면, 내가 FBClient.fbc.FRAME_WIDTHFRAME_HEIGHT을 수행하여 State 클래스에서 액세스하려고, 그것은 NullPointerException가 발생합니다.

getters 대신 FBClient 클래스의 상수에 직접 액세스하려고하면 올바르게 인쇄됩니다.

마지막

당신의 시간을 주셔서 감사합니다, 당신은 작업에 더 많은 정보가 필요하면, 코멘트에 부탁하고 나는 그것을 제공 할 수 있습니다. 또한, 질문이 잘 구성되지 않았거나 잘 설명되지 않은 경우 사과드립니다. 그렇다면 어떻게 개선 할 수 있는지 말해주십시오. 또한이 질문에 대한 답변을 이미 한 번 들었 으면 사과드립니다.하지만 제가 말했던 것처럼, 나는 내 연구를했습니다.

편집 # 1

주석은 내가이 null인지 확인하는 fbc 값을 출력 제안했다. 그래서이 코드 줄을 State 생성자에 추가했습니다. if(FBClient.fbc != null) System.out.println("Not null"); else System.out.println("Null"); 그리고 의심되는 것처럼 null이 출력되었습니다. 왜 그런가요? 나는 명확하게 할당 전에 FBClient.fbc 를 참조하는 main 방법에서 변수 ...

+0

"FBClient.fbc"의 값을 인쇄 할 수 있습니까? 나는 그것의 null을 의심한다. – user1697575

+0

예, 지금 당장 가서 결과를 보여주는 편집을하겠습니다. –

답변

1

문제가 발생하는 이유는 생성자 호출 내에서 FBClient.fbc를 참조하려고하기 때문에 개체가 자체 작성을 완료하지 않았기 때문입니다. 즉각적으로이 작업을 수행하는 것은 분명하지 않지만 생성자 내의 코드를 따르면 init()을 호출하고 궁극적으로 상태 생성자를 호출하고 FBClient.fbc.getFRAME_WIDTH()를 사용하려고 시도합니다. 이 도움이

public static void main(String[] args) 
    { 
     try 
     { 
      //First call in exception chain: 
      fbc = new FBClient(); 
      fbc.init(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      System.exit(1); 
     } 

    } 

희망 :

나는 당신이 FBClient 생성자 내에서() 초기화를 전화로 main 메소드 코드를 변경하지 않는 것이 좋습니다.

2

를 초기화 (실제로는 생성자가 작업을 완료 한 후 FBC 할당받을 때문에 생성자). 문제를 해결하려면 static을 최종 값에 추가하고 게터를 고정시키고 acess를 FBClient.getFRAME_HEIGHT()으로 만듭니다.정적이 아닌 최종 변수는 필요하지 않습니다.

+0

나는 그것을하려고 노력할 것이다. –

+1

그랬어! 고맙습니다 –

0

고객님의 FBClient.fbc은 null이라고 생각합니다.

관련 문제