Android Studio开发Bingo应用:Java全局ArrayList报错‘无法解析符号’求助
解决你的Bingo号码呼叫应用问题
嘿,我来帮你理清这个问题的几个关键点,你就能快速搞定啦!
首先,Android应用里完全不需要main()方法——你现在把存储号码的ball ArrayList放在main()里,这部分代码根本不会被执行,这就是为什么点击按钮时会提示“无法解析符号‘ball’”的核心原因。Android的组件(比如Activity)的入口是onCreate()方法,所有初始化逻辑都应该放在这里或者类的成员变量中。
其次,你之前尝试把ArrayList放在onCreate()里但遇到final的问题,是因为匿名内部类(就是你写的OnClickListener)访问局部变量时需要变量是final的,但你要修改这个列表,所以不能用final。解决办法很简单:把ball声明为Activity的成员变量,放在类的内部、所有方法的外面,这样匿名内部类就能直接访问它,而且不需要加final,还能正常修改。
最后,你代码里的ball.remove(r);是错误的——r是Random对象,而ArrayList.remove()需要的是要移除的元素或者元素的索引,你应该移除刚才随机选中的call字符串。
修改后的完整代码
public class MainActivity extends AppCompatActivity { // 把ArrayList声明为Activity的成员变量 private ArrayList<String> ball; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化号码列表 ball = new ArrayList<>(); ball.add("B1"); ball.add("B2"); ball.add("B3"); ball.add("B4"); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 先判断列表是否为空,避免报错 if (ball.isEmpty()) { TextView text = findViewById(R.id.result); text.setText("所有号码已呼叫完毕!"); return; } Random r = new Random(); // 先获取随机索引 int randomIndex = r.nextInt(ball.size()); String call = ball.get(randomIndex); TextView text = findViewById(R.id.result); text.setText(call); // 根据索引移除元素(比移除字符串更准确,避免重复号码的问题) ball.remove(randomIndex); } }); } }
几个额外的小提示
- 我这里用了
remove(randomIndex)而不是remove(call),是因为如果你的列表里有重复号码(虽然Bingo里不会,但养成好习惯),按索引移除更准确。 - 加了列表为空的判断,防止当所有号码都被移除后,
r.nextInt(ball.size())因为size为0抛出异常。 - 注意Android Studio里的视图绑定,现在推荐用ViewBinding代替
findViewById,不过你是初学者,先搞定当前问题再慢慢学习进阶用法就好。
内容的提问来源于stack exchange,提问作者Digiorno
相关产品推荐
相关产品推荐

