0

私は基本的なゲームをやろうとしています.Ball.java、Scratch.java、およびPanel.javaという名前のクラスがあります

パネルで、Ball.java クラスから情報を取得しようとしていますが、NullPointerException が発生します。コードのどこが間違っていますか?

Panel.java のこのコードで例外を取得する

public Rect getBoundsBall(){
    return new Rect (top.getX(), top.getY(),top.getX()+ball.getWidth() ,top.getY()+ball.getHeight() );
}

エラーログ

10-13 12:57:28.746: E/AndroidRuntime(367): FATAL EXCEPTION: Thread-10
10-13 12:57:28.746: E/AndroidRuntime(367): java.lang.NullPointerException
10-13 12:57:28.746: E/AndroidRuntime(367):  at com.emredavarci.denemeler.Panel.getBoundsBall(Panel.java:44)
10-13 12:57:28.746: E/AndroidRuntime(367):  at com.emredavarci.denemeler.Panel.update(Panel.java:70)
10-13 12:57:28.746: E/AndroidRuntime(367):  at com.emredavarci.denemeler.TutorialThread.run(TutorialThread.java:30)

Panel.java

public class Panel extends SurfaceView implements SurfaceHolder.Callback {

    private TutorialThread _thread;

    Scratch raket=new Scratch();
    Ball top=new Ball();
    Bitmap ball;
    Bitmap _scratch;

    public Panel(Context context) {
        super(context);
        getHolder().addCallback(this);
        _thread = new TutorialThread(getHolder(), this); /
        setFocusable(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) { // to
        switch (event.getAction()){
           case MotionEvent.ACTION_MOVE: // 
           raket.setX((int)(event.getX()));
           break;
       }

       return true;

    }

    public Rect getBoundsBall(){
        return new Rect (top.getX(), top.getY(),top.getX()+ball.getWidth() ,top.getY()+ball.getHeight() );
    }

    public Rect getBoundsScratch(){
        return new Rect (raket.getX(), raket.getY(),raket.getX()+_scratch.getWidth() ,raket.getY()+_scratch.getHeight() );
    }

    public void update(){ /


        if((top.getX()<480) && (top.getX()>0)){
            top.setX(top.getX()+top.getxdirection());
            }
        if((top.getX()==480) || (top.getX()==0)){
            top.setxdirection(-1);
            top.setX(top.getX()+top.getxdirection());
        }
        if((top.getY()<780) && (top.getY()>0)){
            top.setY(top.getY()+top.getydirection());
            }
        if((top.getY()==780) || (top.getY()==0)){
            top.setydirection(-1);
            top.setY(top.getY()+top.getydirection());
        }


        Rect BallBounds = getBoundsBall();
        Rect ScratchBounds = getBoundsScratch();

        if( BallBounds.intersect(ScratchBounds)     ){              
            top.setydirection(-1); 
            //top.setY(top.getY()); !!!!
        }   

    }





    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
    }

    public void surfaceCreated(SurfaceHolder holder) {
         _thread.setRunning(true);
         _thread.start();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // simply copied from sample application LunarLander:
        // we have to tell thread to shut down & wait for it to finish, or else
        // it might touch the Surface after we return and explode
        boolean retry = true;
        _thread.setRunning(false);
        while (retry) {
            try {
                _thread.join();
                retry = false;
            } catch (InterruptedException e) {
                // we will try it again and again...
            }
        }
    }

    @Override
    public void onDraw(Canvas canvas) {  
    _scratch = BitmapFactory.decodeResource(getResources(), R.drawable.red2);
    ball = BitmapFactory.decodeResource(getResources(), R.drawable.ball);
    canvas.drawColor(Color.BLACK);
    canvas.drawBitmap(_scratch, raket.getX() - (_scratch.getWidth() / 2), raket.getY() - (_scratch.getHeight() / 2), null);
    canvas.drawBitmap(ball, top.getX() - (ball.getWidth() / 2), top.getY() - (ball.getHeight() / 2), null);
    }

}

Ball.java

public class Ball {

    private int x=100;          // the X coordinate
    private int y=100;          // the Y coordinate
    int xdirection=10;
    int ydirection=10;


    public Ball() {
        // TODO Auto-generated constructor stub
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

    public void setX(int a){
        x=a;
    }

    public void setY(int b){
        y=b;
    }

    public int getxdirection(){
        return xdirection;
    }

    public int getydirection(){
        return ydirection;
    }

    public void setxdirection(int a){
         xdirection=xdirection*a;
    }

    public void setydirection(int b){
        ydirection=ydirection*b;
    }

    //while ile ball u hareket ettir
    //ball un koordinatlarını sakla


}

Scratch.java

public class Scratch {

    private int x = 250; 
    private int y = 600;

    public Scratch() {
        // TODO Auto-generated constructor stub
    }

    public void setX(int a){
        x=a;
    }

    public void setY(int b){
        y=b;
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

}
4

2 に答える 2

1

次のようなものがありません。

Ball top = new Ball();

つまり、変数topは初期化されませんが、updateメソッドで使用されます。

また、の外部のオブジェクトを初期ballます。前に呼ばれるかどうか誰が知っていますか?onDrawupdateonDraw

于 2012-10-13T12:34:12.743 に答える
1

@Rudolphの答えに追加して、Bitmap ball初期化されていますか? 念のため、次のようにログインballしてみてください。

public Rect getBoundsBall(){
    log.v("ball",""+ball);
    return new Rect (top.getX(), top.getY(),top.getX()+ball.getWidth() ,top.getY()+ball.getHeight() );
}

またはどちらballtopが犯人です。初期化されていないものを見つけて、それに応じて対処してください。

于 2012-10-13T13:15:08.563 に答える