Java Android nullPointerException错误

Java Android nullPointerException错误,java,android,Java,Android,我无法运行我的程序。应用程序崩溃了。我试图通过touchEvent使图像在屏幕上移动 java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.swapnil.new1.model.conmponents.Speed.getxDirection()' on a null object reference at com.example.swapnil.new1.GamePanel.u

我无法运行我的程序。应用程序崩溃了。我试图通过touchEvent使图像在屏幕上移动

java.lang.NullPointerException:  Attempt to invoke virtual method 'int com.example.swapnil.new1.model.conmponents.Speed.getxDirection()' on a null object reference
    at com.example.swapnil.new1.GamePanel.update(GamePanel.java:89)
    at com.example.swapnil.new1.MainThread.run(MainThread.java:32)
我添加了
Speed
类,我认为这是导致此异常的原因。建议任何更新

Speed
类具有导致异常的
getxDirection
方法

package com.example.swapnil.new1.model.conmponents;

public class Speed {
    public static final int DIRECTION_RIGHT = 1;
    public static final int DIRECTION_LEFT = -1;
    public static final int DIRECTION_UP = -1;
    public static final int DIRECTION_DOWN = 1;

    private float xv = 1; // speed in x
    private float yv = 1; // speed in y

    private int xDirection = DIRECTION_RIGHT;
    private int yDirection = DIRECTION_DOWN;

    public Speed() {
        this.xv = 1;
        this.yv = 1;
    }

    public Speed(float xv, float yv) {
        this.xv = xv;
        this.yv = yv;
    }

    public float getXv() {
        return xv;
    }

    public void setXv(float xv) {
        this.xv = xv;
    }

    public float getYv() {
        return yv;
    }

    public void setYv(float yv) {
        this.yv = yv;
    }

    public int getxDirection() {
        return xDirection;
    }

    public void setxDirection(int xDirection) {
        this.xDirection = xDirection;
    }

    public int getyDirection() {
        return yDirection;
    }

    public void setyDirection(int yDirection) {
        this.yDirection = yDirection;
    }

    public void toggleXDirection() {
        xDirection = xDirection * -1;
    }

    public void toggleYDirection() {
        yDirection = yDirection * -1;
    }
}
主线程
类:

package com.example.swapnil.new1;

import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;

public class MainThread extends Thread {
    private static final String TAG = MainThread.class.getSimpleName();
    private boolean running;
    private SurfaceHolder surfaceHolder;
    private GamePanel gamePanel;

    public MainThread(SurfaceHolder surfaceHolder , GamePanel gamePanel) {
        super();
        this.surfaceHolder = surfaceHolder;
        this.gamePanel = gamePanel;
    }

    public void setRunning(boolean running) {
        this.running = running;
    }

    @Override
    public void run() {
        Canvas canvas;
        Log.d(TAG , "Starting game loop");
        while(running) {
            canvas = null;
            try {
                canvas = this.surfaceHolder.lockCanvas();
                synchronized (surfaceHolder) {
                    this.gamePanel.render(canvas);
                    this.gamePanel.update();
                }
            } finally {
                if(canvas != null) {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}
import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import com.example.swapnil.new1.model.Droid;
import com.example.swapnil.new1.model.conmponents.Speed;

public class GamePanel extends SurfaceView implements
        SurfaceHolder.Callback {

    private static final String TAG = GamePanel.class.getSimpleName();

    private MainThread thread;
    private Droid droid;

    public GamePanel(Context context) {
        super(context);
        getHolder().addCallback(this);
        droid = new Droid(BitmapFactory.decodeResource(getResources(),R.drawable.droid_1),50,50);
        thread = new MainThread(getHolder() , this);
        setFocusable(true);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        thread.setRunning(true);
        thread.start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        while (retry) {
            try {
                thread.join();
                retry = false;
            }catch (InterruptedException e) {
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            droid.handleActionDown((int)event.getX(),(int)event.getY());
            if (event.getY() > getHeight() - 50) {
             thread.setRunning(false);
                ((Activity)getContext()).finish();
            } else {
                Log.d(TAG , "Coords : x = " + event.getX() + ",y = " + event.getY());
            }
        }

        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            if (droid.isTouched()) {
                droid.setX((int)event.getX());
                droid.setY((int) event.getY());
            }
        }
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if (droid.isTouched()) {
                droid.setTouched(false);
            }
        }
        return true;
    }

    // changed protected to public
    protected void render(Canvas canvas) {
        canvas.drawColor(Color.BLACK);
        droid.draw(canvas);
    }

    public void update() {
        // collision with right
        if (droid.getSpeed().getxDirection() == Speed.DIRECTION_RIGHT &&
                droid.getX() + droid.getBitmap().getWidth()/2 >= getWidth()) {
            droid.getSpeed().toggleXDirection();
        }
        //collision with left
        if (droid.getSpeed().getxDirection() == Speed.DIRECTION_LEFT &&
                droid.getX() - droid.getBitmap().getWidth()/2 <= 0) {
            droid.getSpeed().toggleXDirection();
        }
        // collision with down
        if (droid.getSpeed().getyDirection() == Speed.DIRECTION_DOWN &&
                droid.getY() + droid.getBitmap().getHeight()/2 >= getHeight()) {
            droid.getSpeed().toggleYDirection();
        }
        //collision with up
        if (droid.getSpeed().getyDirection() == Speed.DIRECTION_UP &&
                droid.getY() - droid.getBitmap().getHeight()/2 <= 0) {
            droid.getSpeed().toggleYDirection();
        }
        droid.update();
    }
}

GamePanel
类:

package com.example.swapnil.new1;

import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;

public class MainThread extends Thread {
    private static final String TAG = MainThread.class.getSimpleName();
    private boolean running;
    private SurfaceHolder surfaceHolder;
    private GamePanel gamePanel;

    public MainThread(SurfaceHolder surfaceHolder , GamePanel gamePanel) {
        super();
        this.surfaceHolder = surfaceHolder;
        this.gamePanel = gamePanel;
    }

    public void setRunning(boolean running) {
        this.running = running;
    }

    @Override
    public void run() {
        Canvas canvas;
        Log.d(TAG , "Starting game loop");
        while(running) {
            canvas = null;
            try {
                canvas = this.surfaceHolder.lockCanvas();
                synchronized (surfaceHolder) {
                    this.gamePanel.render(canvas);
                    this.gamePanel.update();
                }
            } finally {
                if(canvas != null) {
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}
import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import com.example.swapnil.new1.model.Droid;
import com.example.swapnil.new1.model.conmponents.Speed;

public class GamePanel extends SurfaceView implements
        SurfaceHolder.Callback {

    private static final String TAG = GamePanel.class.getSimpleName();

    private MainThread thread;
    private Droid droid;

    public GamePanel(Context context) {
        super(context);
        getHolder().addCallback(this);
        droid = new Droid(BitmapFactory.decodeResource(getResources(),R.drawable.droid_1),50,50);
        thread = new MainThread(getHolder() , this);
        setFocusable(true);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        thread.setRunning(true);
        thread.start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        while (retry) {
            try {
                thread.join();
                retry = false;
            }catch (InterruptedException e) {
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            droid.handleActionDown((int)event.getX(),(int)event.getY());
            if (event.getY() > getHeight() - 50) {
             thread.setRunning(false);
                ((Activity)getContext()).finish();
            } else {
                Log.d(TAG , "Coords : x = " + event.getX() + ",y = " + event.getY());
            }
        }

        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            if (droid.isTouched()) {
                droid.setX((int)event.getX());
                droid.setY((int) event.getY());
            }
        }
        if (event.getAction() == MotionEvent.ACTION_UP) {
            if (droid.isTouched()) {
                droid.setTouched(false);
            }
        }
        return true;
    }

    // changed protected to public
    protected void render(Canvas canvas) {
        canvas.drawColor(Color.BLACK);
        droid.draw(canvas);
    }

    public void update() {
        // collision with right
        if (droid.getSpeed().getxDirection() == Speed.DIRECTION_RIGHT &&
                droid.getX() + droid.getBitmap().getWidth()/2 >= getWidth()) {
            droid.getSpeed().toggleXDirection();
        }
        //collision with left
        if (droid.getSpeed().getxDirection() == Speed.DIRECTION_LEFT &&
                droid.getX() - droid.getBitmap().getWidth()/2 <= 0) {
            droid.getSpeed().toggleXDirection();
        }
        // collision with down
        if (droid.getSpeed().getyDirection() == Speed.DIRECTION_DOWN &&
                droid.getY() + droid.getBitmap().getHeight()/2 >= getHeight()) {
            droid.getSpeed().toggleYDirection();
        }
        //collision with up
        if (droid.getSpeed().getyDirection() == Speed.DIRECTION_UP &&
                droid.getY() - droid.getBitmap().getHeight()/2 <= 0) {
            droid.getSpeed().toggleYDirection();
        }
        droid.update();
    }
}
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.BitmapFactory;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.util.Log;
导入android.view.MotionEvent;
导入android.view.SurfaceHolder;
导入android.view.SurfaceView;
导入com.example.swapnil.new1.model.Droid;
导入com.example.swapnil.new1.model.concomponents.Speed;
公共类GamePanel扩展了SurfaceView实现
SurfaceHolder,回拨{
私有静态最终字符串标记=GamePanel.class.getSimpleName();
私有主线程;
私人机器人;
公共游戏面板(上下文){
超级(上下文);
getHolder().addCallback(此);
droid=新的droid(BitmapFactory.decodeResource(getResources(),R.drawable.droid_1),50,50);
线程=新的主线程(getHolder(),this);
设置聚焦(真);
}
@凌驾
已创建的公共空白表面(表面持有人){
thread.setRunning(true);
thread.start();
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
布尔重试=真;
while(重试){
试一试{
thread.join();
重试=错误;
}捕捉(中断异常e){
}
}
}
@凌驾
公共布尔onTouchEvent(运动事件){
if(event.getAction()==MotionEvent.ACTION\u向下){
droid.handleActionDown((int)event.getX(),(int)event.getY());
if(event.getY()>getHeight()-50){
thread.setRunning(false);
((活动)getContext()).finish();
}否则{
Log.d(标记,“Coords:x=“+event.getX()+”,y=“+event.getY());
}
}
if(event.getAction()==MotionEvent.ACTION\u MOVE){
if(droid.isTouched()){
droid.setX((int)event.getX());
droid.setY((int)event.getY());
}
}
if(event.getAction()==MotionEvent.ACTION\u UP){
if(droid.isTouched()){
机器人被触摸(假);
}
}
返回true;
}
//已更改为公共保护
受保护的void渲染(画布){
画布。drawColor(颜色。黑色);
droid.draw(画布);
}
公共无效更新(){
//右撞
如果(droid.getSpeed().getxDirection()==Speed.DIRECTION\u RIGHT&&
droid.getX()+droid.getBitmap().getWidth()/2>=getWidth()){
droid.getSpeed().toggleXDirection();
}
//左撞
如果(droid.getSpeed().getxDirection()==Speed.DIRECTION\u左&&
droid.getX()-droid.getBitmap().getWidth()/2=getHeight()){
droid.getSpeed().toggleYDirection();
}
//撞上
如果(droid.getSpeed().getyDirection()==Speed.DIRECTION\u UP&&

droid.getY()-droid.getBitmap().getHeight()/2未设置droid对象中的速度字段。在GamePanel.update()方法中,您正在该字段上调用getxDirection,这会导致NullPointerException。

如果您指出哪些行是32和89,我们将看不到行号。更新()中的droid对象方法为空。
droid
在GamePanel构造函数中初始化。可能是您对
droid
-
droid=new droid的初始化语句(BitmapFactory.decodeResource(getResources(),R.drawable.droid_1),50,50);
--以某种方式被破坏了?在运行方法this.GamePanel.update()的主线程中有错误,并且在游戏面板更新方法中有错误可能重复