求大神分析为何报错,空对象引用问题

Nabati 2016-08-22 05:53:37
private void Draw() {

/**绘制游戏背景**/
//mCanvas.drawBitmap(mbitmapBg,0,0, mPaint);
mCanvas.drawColor(Color.rgb(255,255,255)); //此行报错
/**绘制小球**/
mCanvas.drawCircle(mPosX,mPosY,mCircleRadius,mCirclePaint);
//mCanvas.drawBitmap(mbitmapBall, mPosX,mPosY, mPaint);
/**X轴 Y轴 Z轴的重力值**/
mCanvas.drawText("X轴重力值 :" + mGX, 0, 20, mPaint);
mCanvas.drawText("Y轴重力值 :" + mGY, 0, 40, mPaint);
mCanvas.drawText("Z轴重力值 :" + mGZ, 0, 60, mPaint);
}


报错内容:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int)' on a null object reference


求大神分析!
...全文
398 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
a784063999 2016-08-22
  • 打赏
  • 举报
回复
引用 5 楼 weixin_35771961 的回复:
红色部分报错,求解决!
mCanvas = new Canvas();
這句改成mCanvas = null; 因為你是用mSurfaceHolder.lockCanvas();這函數返回的Canvas對象 在Draw()這方法開頭加個if (mCanvas == null) return;看看
Nabati 2016-08-22
  • 打赏
  • 举报
回复
红色部分报错,求解决!
Nabati 2016-08-22
  • 打赏
  • 举报
回复
public class MyView extends SurfaceView implements SurfaceHolder.Callback,Runnable ,SensorEventListener{ /**每50帧刷新一次屏幕**/ public static final int TIME_IN_FRAME = 10; /** 游戏画笔 **/ Paint mPaint = null; Paint mTextPaint = null; SurfaceHolder mSurfaceHolder = null; /** 控制游戏更新循环 **/ boolean mRunning = false; /** 游戏画布 **/ Canvas mCanvas = null; /**控制游戏循环**/ boolean mIsRunning = false; /**SensorManager管理器**/ private SensorManager mSensorMgr = null; Sensor mSensor = null; /**手机屏幕宽高**/ int mScreenWidth = 0; int mScreenHeight = 0; /**小球资源文件越界区域**/ private int mScreenBallWidth = 0; private int mScreenBallHeight = 0; /**游戏背景文件**/ //private Bitmap mbitmapBg; private int mCircleRadius = 48; private int mCircleColor = Color.CYAN; private Paint mCirclePaint = new Paint(); private int mBackgroundColor = Color.DKGRAY; /**小球资源文件**/ // private Bitmap mbitmapBall; /**小球的坐标位置**/ private float mPosX = 200; private float mPosY = 0; /**重力感应X轴 Y轴 Z轴的重力值**/ private float mGX = 0; private float mGY = 0; private float mGZ = 0; public MyView(Context context) { super(context); /** 设置当前View拥有控制焦点 **/ this.setFocusable(true); /** 设置当前View拥有触摸事件 **/ this.setFocusableInTouchMode(true); /** 拿到SurfaceHolder对象 **/ mSurfaceHolder = this.getHolder(); /** 将mSurfaceHolder添加到Callback回调函数中 **/ mSurfaceHolder.addCallback(this); /** 创建画布 **/ mCanvas = new Canvas(); /** 创建曲线画笔 **/ mPaint = new Paint(); mPaint.setColor(Color.WHITE); mCirclePaint.setColor(mCircleColor); /**加载小球资源**/ //mbitmapBall = BitmapFactory.decodeResource(this.getResources(), R.mipmap.ic_launcher); /**加载游戏背景**/ // mbitmapBg = BitmapFactory.decodeResource(this.getResources(), R.drawable.switch_thumb_pressed_holo_light); /**得到SensorManager对象**/ mSensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); mSensor = mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // 注册listener,第三个参数是检测的精确度 //SENSOR_DELAY_FASTEST 最灵敏 因为太快了没必要使用 //SENSOR_DELAY_GAME 游戏开发中使用 //SENSOR_DELAY_NORMAL 正常速度 //SENSOR_DELAY_UI 最慢的速度 mSensorMgr.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME); } private void Draw() { mCanvas.drawText("X轴重力值 :" + mGX, 0, 20, mPaint); mCanvas.drawText("Y轴重力值 :" + mGY, 0, 40, mPaint); mCanvas.drawText("Z轴重力值 :" + mGZ, 0, 60, mPaint); /**绘制游戏背景**/ //mCanvas.drawBitmap(mbitmapBg,0,0, mPaint); mCanvas.drawColor(mBackgroundColor); /**绘制小球**/ mCanvas.drawCircle(mPosX,mPosY,mCircleRadius,mCirclePaint); //mCanvas.drawBitmap(mbitmapBall, mPosX,mPosY, mPaint); /**X轴 Y轴 Z轴的重力值**/ } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { /**开始游戏主循环线程**/ mIsRunning = true; new Thread(this).start(); /**得到当前屏幕宽高**/ mScreenWidth = this.getWidth(); mScreenHeight = this.getHeight(); /**得到小球越界区域**/ /* mScreenBallWidth = mScreenWidth - mbitmapBall.getWidth(); mScreenBallHeight = mScreenHeight - mbitmapBall.getHeight();*/ mScreenBallWidth = mScreenWidth - mCircleRadius; mScreenBallHeight = mScreenHeight - mCircleRadius; } @Override public void surfaceDestroyed(SurfaceHolder holder) { mIsRunning = false; } @Override public void run() { while (mIsRunning) { /** 取得更新游戏之前的时间 **/ long startTime = System.currentTimeMillis(); /** 在这里加上线程安全锁 **/ synchronized (mSurfaceHolder) { /** 拿到当前画布 然后锁定 **/ mCanvas = mSurfaceHolder.lockCanvas(); Draw(); /** 绘制结束后解锁显示在屏幕上 **/ mSurfaceHolder.unlockCanvasAndPost(mCanvas); } /** 取得更新游戏结束的时间 **/ long endTime = System.currentTimeMillis(); /** 计算出游戏一次更新的毫秒数 **/ int diffTime = (int) (endTime - startTime); /** 确保每次更新时间为50帧 **/ while (diffTime <= TIME_IN_FRAME) { diffTime = (int) (System.currentTimeMillis() - startTime); /** 线程等待 **/ Thread.yield(); } } } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { mGX = event.values[SensorManager.DATA_X]; mGY= event.values[SensorManager.DATA_Y]; mGZ = event.values[SensorManager.DATA_Z]; //这里乘以2是为了让小球移动的更快 mPosX -= mGX ; mPosY += mGY ; //检测小球是否超出边界 if (mPosX < mCircleRadius) { mPosX = mCircleRadius; } else if (mPosX > mScreenBallWidth) { mPosX = mScreenBallWidth; } if (mPosY < mCircleRadius) { mPosY = mCircleRadius; } else if (mPosY > mScreenBallHeight) { mPosY = mScreenBallHeight; } } } //设置actionbar中的flowover @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_settings: Intent intent = new Intent(MainActivity.this, SettingActivity.class); MainActivity.this.startActivity(intent); return true; default: return super.onOptionsItemSelected(item); } } } 此部分报错,求解决!
Nabati 2016-08-22
  • 打赏
  • 举报
回复
引用 1 楼 qq_35619786 的回复:
你报错那行前面加下 打印下你的mCanvas的值看下
打印了之后显示并不是空的啊
a784063999 2016-08-22
  • 打赏
  • 举报
回复
你的mCanvas從哪裏來的
lucers 2016-08-22
  • 打赏
  • 举报
回复
你报错那行前面加下 打印下你的mCanvas的值看下

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧