2016-06-19 4 views
-3

한 클래스에서 다른 클래스에서 액세스하려는 개인 변수를 선언했습니다. 그러나 문제는 객체 flappyBird을 전달할 때 null이라는 것입니다. 내가해야 할 변화는 무엇입니까?NPE 방지 : 다른 클래스의 개인 객체에 액세스

FlappyBird.java : 개체가 여기에 생성

public class FlappyBird implements ActionListener, KeyListener, MouseListener 
{ 

    private static FlappyBird flappyBird; 

    public static void main(String[] args) 
     /* CREATE INSTANCE OF FLAPPBIRD() */ 
    { 
     flappyBird = new FlappyBird(); 
    } 

    public static FlappyBird getBird() { 
     return flappyBird; 
    } 

    public static void paint(Graphics phics) { 
     ... 
    } 

GraphicRenderer.java : 여기

public class GraphicsRenderer extends JPanel 
    { 
     private static FlappyBird bird = new FlappyBird(); 

    public void paint(Graphics phics) 
    { 
     // Generate game graphics by calling paint() in FlappyBird. 
     bird.getBird(); 
     super.paint(phics); 
     bird.paint(phics); 
    } 
} 
+1

는'getBird()'라는있는 방법이 없습니다와'setBird'/기타 부품이 매우 잘못하고 의미 – Li357

+0

, 내 나쁜 입력하지 않은 @AndrewL하지 않는 권리 – Ben

답변

1

액세스 개체는 귀하의 수업은 매우 잘못입니다. 게터가없고 많은 부분이 이해가되지 않습니다. 여기에 코드 뭐가 잘못의 목록입니다 : 현장은 항상 몇 가지 이유를 들어

  • , 인스턴스에 대한 필드 널 (null)이 될 것이다, 그래서

    • 아니 세터

    • 당신은 구현하지 않습니다 구현 한 인터페이스의 메소드. 나는 여기에서 그것을 고치지 않겠지 만 직접 구현한다.

    • FlappyBird 클래스에는 아무런 방법이 없다. paint(). 내가 생성자를 추가

      public class FlappyBird implements ActionListener, KeyListener, MouseListener { 
      
          private static FlappyBird flappyBird; 
      
          public FlappyBird(/* Some attributes to the bird */) { 
           /* Field = attribute */ 
          } 
      
          public static void main(String[] args) { 
           flappyBird = new FlappyBird(/* Constructor Args */); 
          } 
      
          public FlappyBird getBird() { 
           return flappyBird; 
          } 
      
          public void setBird(/* You decide the arguments */) { 
           /* Field = argument */ 
          } 
      } 
      

      가 고정 : 당신이 스스로 그렇게 할 수 있기 때문에 나는이 듣고 해결되지 않습니다 당신이 방법 여기

    에 관한 세부 사항을 제공하지 않는 것은 약간의 수정입니다 위의 코드는 세터를 추가했습니다. 생성자는 다음과 같이 호출됩니다.

    FlappyBird fb = new FlappyBird(arguments); 
    

    이제 호출 할 때 생성자를 인스턴스화하고 호출해야합니다. 그런 다음 메소드에 액세스 할 수 있습니다. 반환 값을 bfb에 인스턴스로 저장했습니다. 이 코드를 확장 할 수 있습니다. 당신은 이해한다

    public class GraphicsRenderer extends JPanel { 
    
        public void paint(Graphics phics) { 
         FlappyBird fb = new FlappyBird(/*Args*/); 
         FlappyBird b = fb.getBird(); 
         fb.setBird(/*Args*/); 
        } 
    } 
    
  • +0

    안녕하세요, 저를 도우려는 것에 진심으로 감사 드리며 광범위한 답변을드립니다. 1 quesion, "구현 한 인터페이스에서 메소드를 구현하지 않습니까?" – Ben

    +0

    ActionListener, KeyListener 및 MouseListener를 구현합니다. 나는 당신이'actionPerformed()'와 같은 인터페이스로부터 메소드를 구현할 필요가 있음을 지적했다. 내가 도움을 주었다면, 받아들이는 것을 고려해라. ^) – Li357

    +0

    아하. 나는 관련성이 있다고 생각하지 않았기 때문에 구현과 다른 것들을 남겼다. 그리고 아직 NPE를 완전히 풀지는 못했지만, 많은 도움을주었습니다. – Ben

    관련 문제