【问题标题】:App crashes when I create a new bullet [Andoid Studio]创建新项目符号时应用程序崩溃 [Android Studio]
【发布时间】:2021-12-08 16:22:46
【问题描述】:

我试图让我的播放器在我每次点击屏幕时生成一个子弹。但是,每次我这样做时它都会崩溃并给我这个错误:

E/AndroidRuntime: FATAL EXCEPTION: Thread-3
    Process: com.example.mgp2021, PID: 20750
    java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
        at com.example.mgp2021.Bullet.Render(Bullet.java:57)

这是子弹的脚本:

package com.example.spaceshooter;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceView;


public class Bullet implements EntityBase{
    private boolean isDone = false;
    private Bitmap bullet = null, scaledbmp = null;

    public float xPos = 0;
    public float yPos = 0;

    private float yLimit = 0;
    //float imgRadius = bullet.getHeight() * 0.5f;

    @Override
    public boolean IsDone() {
        return isDone;
    }

    @Override
    public void SetIsDone(boolean _isDone) {
        isDone = _isDone;
    }

    @Override
    public void Init(SurfaceView _view) {
        bullet = BitmapFactory.decodeResource(_view.getResources(), R.drawable.bullet);
        //setting up values
        xPos = DraggablePlayer.Instance.xPos;
        yPos = DraggablePlayer.Instance.yPos;
        //yLimit = _view.getHeight() * 0.5f;
    }


    @Override
    public void Update(float _dt) {
        yPos -= _dt * 300.f;

        if(bullet == null)
        {
            Log.e("ERR","Failed to decode resource bullet");
        }
    }

    @Override
    public void Render(Canvas _canvas) {
        Matrix transform = new Matrix();
        transform.postTranslate(-bullet.getWidth()*0.5f, -bullet.getHeight()*0.5f);
        transform.postTranslate(xPos, yPos);
        _canvas.drawBitmap(bullet, transform, null);
    }

    @Override
    public boolean IsInit() {
        return bullet != null;
    }

    @Override
    public int GetRenderLayer() {
        return LayerConstants.BULLET_LAYER;
    }

    @Override
    public void SetRenderLayer(int _newLayer) {
    }

    @Override
    public ENTITY_TYPE GetEntityType() {
        return ENTITY_TYPE.ENT_BULLET;
    }

    public static Bullet Create() {
        Bullet result = new Bullet();
        EntityManager.Instance.AddEntity(result, ENTITY_TYPE.ENT_BULLET);
        return result;
    }
}

这是我生成子弹时的脚本:

public void Update(float _dt) {

        EntityManager.Instance.Update(_dt);

       if (TouchManager.Instance.IsDown())
       {
            Bullet.Create();
       }
    }

我真的不确定是什么导致了这个错误,非常感谢任何帮助

【问题讨论】:

  • 你的变量bullet来自哪里?
  • 第 57 行的位图实例为空,因此不能在空对象引用上调用 getWidth()。
  • 您应该检查在方法“Init”中为子弹变量初始化新值,默认值为您在声明时给出的NULL,因为该变量值为null,所以出现崩溃,可能读取drawable“R. drawable.bullet" 返回空值检查一下
  • @VojinPurić private Bitmap bullet = null, scaledbmp = null;

标签: java android android-studio


【解决方案1】:

问题是你调用了你的子弹类的静态Create 方法,它返回一个Bullet 的实例,但是你从不调用(从你发布的代码来看)Init 方法实际上会将R.drawable.bullet 的内容读入位图对象。

答案: 确保在Render 之前调用Init。


将Bullet 对象的创建与在您的应用中工作的其他对象的创建进行比较(我说的是实现EntityBase 的对象)。

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多