我意识到之前已经提出了类似的问题,但我是初学程序员正在开发我的第一个应用程序,如果有人能帮助我理解使用我的特定代码,我将非常感激。
今天是第一次出现。几个星期前我发布了我的游戏,有几十个人玩过它没有任何问题,所以我试图弄清楚为什么会发生这种情况,因为相同的代码可能至少成功运行了50次。
会议开始后10秒发生:
异常java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.view.View android.view.View.findViewById(int)'
所涉及的两行代码出现在CountDownTimer的onTick方法中,该方法在用户单击按钮时启动。他们是:
View currentView = gridView.getChildAt(randomPosition);
ImageView image = (ImageView) currentView.findViewById(R.id.button);
GridView是在onCreate方法的开头附近实现的:
adapter = new ButtonAdapter(this, clickButtons);
gridView = (GridView) findViewById(R.id.gridview);
gridView.setAdapter(adapter);
我猜测gridView在某种程度上是null,但由于在onCreate中实现它的代码在CountDownTimer启动之前运行,我不确定这是怎么回事。
编辑:现在我开始认为问题在适配器中。
public class ButtonAdapter extends ArrayAdapter<ClickButton> {
public ButtonAdapter(@NonNull Context context, @NonNull ClickButton[] objects) {
super(context, 0, objects);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
// Check if an existing view is being reused, otherwise inflate the view
View gridItemView = convertView;
if (gridItemView == null) {
gridItemView = LayoutInflater.from(getContext()).inflate(
R.layout.button, parent, false);
}
ClickButton currentButton = getItem(position);
ImageView button = (ImageView) gridItemView.findViewById(R.id.button);
button.setImageResource(currentButton.mSource);
button.setAlpha(currentButton.mOpacity);
return gridItemView;
}
}
Android Studio要我替换
button.setImageResource(currentButton.mSource);
button.setAlpha(currentButton.mOpacity);
与
button.setImageResource(currentButton != null ? currentButton.mSource :
0);
button.setAlpha(currentButton != null ? currentButton.mOpacity :
0);
有人可以解释这些变化的作用吗?您是否认为没有这些更改是导致崩溃的原因,您是否知道为什么崩溃只发生一次而不是每次都使用应用程序?