Android 尝试获取信息时出现NullPointerException

Android 尝试获取信息时出现NullPointerException,android,nullpointerexception,Android,Nullpointerexception,我正在尝试做一个基本的游戏,我有几个类,分别是Ball.java、Scratch.java和Panel.java public Rect getBoundsBall(){ return new Rect (top.getX(), top.getY(),top.getX()+ball.getWidth() ,top.getY()+ball.getHeight() ); } public class Panel extends SurfaceView implements SurfaceH

我正在尝试做一个基本的游戏,我有几个类,分别是Ball.java、Scratch.java和Panel.java

public Rect getBoundsBall(){
    return new Rect (top.getX(), top.getY(),top.getX()+ball.getWidth() ,top.getY()+ball.getHeight() );
}
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类中获取信息,但得到的是NullPointerException。代码中的错误在哪里

在Panel.java中获取此代码中的Exciption

public Rect getBoundsBall(){
    return new Rect (top.getX(), top.getY(),top.getX()+ball.getWidth() ,top.getY()+ball.getHeight() );
}
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);
    }
错误日志

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 Rect getBoundsBall(){
    return new Rect (top.getX(), top.getY(),top.getX()+ball.getWidth() ,top.getY()+ball.getHeight() );
}
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);
    }
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;
    }

}

您缺少以下内容:

Ball top = new Ball();
i、 e.变量
top
未初始化,但在
update
方法中使用


另外,在
onDraw
的外部初始化
ball
对象。谁知道在
onDraw
之前是否会调用
update

添加到@Rudolph的答案中,您确定
位图球已初始化吗?当然,请尝试将球记录为:

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

无论是
ball
还是
top
都是罪魁祸首。找出哪一个未初始化并进行相应处理。

请同时发布异常的输出。在发布堆栈跟踪时,请记住突出显示异常发生的位置。请考虑变量命名:
Ball-top;位图球
使代码难以理解。对于只初始化一次的变量,我非常喜欢
final
关键字。编译器确保在构造函数或声明中初始化变量。它提高了代码质量!我做了您所说的更改,但仍然出现相同的错误。我还添加了错误日志。谢谢,我在onDraw()之前确实调用了update()。它成功了!