MainActivity无法访问GamePanel变量,遇空对象引用异常求助
问题原因分析
- 空对象引用核心原因:MainActivity中声明的
gamePanel成员变量仅做了声明,未实际赋值。你在onCreate里调用setContentView(new GamePanel(this))时,只是创建了GamePanel实例并设置为界面,但没有把这个实例赋值给gamePanel变量,导致onActivityResult中gamePanel为null,调用gamePanel.images时触发空指针异常。 - 变量访问问题:
images是protected修饰符,若MainActivity和GamePanel在同一个包下,其实是可以直接访问的;如果不在同包,则会无法访问。不过当前核心问题是空指针,先解决这个,再优化访问方式。
分步解决方案
1. 修复空指针异常
修改MainActivity的onCreate方法,将创建的GamePanel实例赋值给成员变量:
@Override protected void onCreate(Bundle savedInstanceState) { //some code gamePanel = new GamePanel(this); // 先实例化并赋值给成员变量 setContentView(gamePanel); // 再设置为界面 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 100); //some code }
2. 优化变量访问(更规范的封装写法)
直接访问protected变量虽然可行,但不符合面向对象的封装原则,建议在GamePanel中添加公共方法来操作images集合:
public class GamePanel extends SurfaceView implements SurfaceHolder.Callback { //some code protected ArrayList<Bitmap> images; public GamePanel(Context context) { super(context); images = new ArrayList<>(); } // 添加公共方法用于添加图片 public void addImage(Bitmap bitmap) { if (bitmap != null) { images.add(bitmap); // 如果需要刷新界面,可以在这里调用相关绘制方法 } } //some code }
然后在MainActivity的onActivityResult中调用这个方法:
if (requestCode == 100) { Bitmap captureImage = (Bitmap) data.getExtras().get("data"); gamePanel.addImage(captureImage); }
3. 额外防坑处理
检查data和data.getExtras()是否为null,避免额外空指针:
if (requestCode == 100 && resultCode == RESULT_OK && data != null) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap captureImage = (Bitmap) extras.get("data"); gamePanel.addImage(captureImage); } }
注:相机拍照返回的data.get("data")仅为缩略图,如果需要获取原图,需指定拍照文件保存路径,可根据需求自行扩展。
内容的提问来源于stack exchange,提问作者Radek0582
相关产品推荐
相关产品推荐

