2014-10-11 2 views
0

다음 프로그램은 간단하며 중력의 영향으로 떨어지고 다시 튀는 공을 그려야합니다. 프로그램이 컴파일하는 것 같지만 예외 오류가 계속 발생합니다.중력 이동 공

공에서, fonction move는 속도와 변위를 계산하기위한 물리 공식을 포함합니다.

패키지 중력;

package gravity; 

import java.applet.Applet; 
import java.awt.Graphics; 

public class StartingPoint extends Applet { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public int x = 400, y = 25; 
    Ball ball; 

    //private static final int nbBalls = 1; 

    @Override 
    public void init() { 
     setSize(800, 600); 

    } 

    @Override 
    public void start() { 
     Ball ball = new Ball(x,y); 
     Thread thread = new Thread(new RunBall(ball)); 
     thread.start(); 

    } 

    public class RunBall implements Runnable{ 
     private Ball ball; 
     RunBall(Ball ball){ 
      this.ball = ball; 
     } 
     @Override 
     public void run() { 
      while(true){ 

       ball.move(); 
       try { 
        Thread.sleep(17); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       repaint(); 
      } 

     } 

    } 

    @Override 
    public void stop() { 

    } 

    @Override 
    public void paint(Graphics g) { 
     ball.paintBALL(g); 
    } 

} 

컴파일러는 다음 exeption 추가 유지

import java.awt.Color; 
import java.awt.Graphics; 

public class Ball extends StartingPoint{ 
/** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
public int x; 
public int y; 

private static final double dt = .2; 
private static final double g = 9.8; 
public double vy = 0; 

Ball(int x, int y){ 
    this.x = x; 
    this.y = y; 
} 

public void move(){ 
    vy += g*dt; 
    y += (1/2)*g * dt*dt + vy * dt; 
    if (y >= (this.getHeight() - 20 -1)){ 
    y = this.getHeight() - 20 -1; 
    vy = -vy;} 

    } 


public void paintBALL(Graphics g){ 
g.setColor(Color.LIGHT_GRAY); 
g.fillOval(x, y, 20, 20); 
} 
} 

: 당신의 start 방법에서

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at gravity.StartingPoint.paint(StartingPoint.java:61) 
at java.awt.Container.update(Container.java:1835) 
at sun.awt.RepaintArea.updateComponent(RepaintArea.java:267) 
at sun.awt.RepaintArea.paint(RepaintArea.java:233) 
at apple.awt.ComponentModel.handleEvent(ComponentModel.java:263) 
at java.awt.Component.dispatchEventImpl(Component.java:4852) 
at java.awt.Container.dispatchEventImpl(Container.java:2142) 
at java.awt.Component.dispatchEvent(Component.java:4604) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:717) 
at java.awt.EventQueue.access$400(EventQueue.java:82) 
at java.awt.EventQueue$2.run(EventQueue.java:676) 
at java.awt.EventQueue$2.run(EventQueue.java:674) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:690) 
at java.awt.EventQueue$3.run(EventQueue.java:688) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:687) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+0

중복 가능성을 [? 무엇 널 (null) 포인터 예외이며, 내가 그것을 어떻게 해결합니까 (http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it) – azurefrog

답변

0

을, 당신은 ... 선언 Ball 재했습니다

Ball ball = new Ball(x,y); 

즉, paint이 호출 될 때 ball 인스턴스 필드는 여전히 null입니다.

대신, start 방법,

ball = new Ball(x,y); 

Applet는 매우 오래되어 당신은 애플릿이 다시 그릴로 깜박 많은 준비를해야한다 ... 인스턴스 필드를 초기화.

가능한 경우 JApplet을 사용하고 JPanel을 기본 페인트 표면으로 사용하는 것이 좋습니다. JPanelpaintComponent 메서드를 재정의함으로써, 당신은 추가 작업을 수행하지 않고 깜박 거림을 중지 기본적으로 더블 버퍼링 지원을받을 수, 그냥 ... y는 사용자 정의 그림을하기 전에 super.paintComponent를 호출하는 것을 잊지 마세요

0

paint 당신의 볼이 정의되기 전에, 단순히 페인트 변경 호출됩니다의

@Override 
public void paint(Graphics g) { 
    if(ball != null)  
    ball.paintBALL(g); 
}