You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Activity启动即闪退问题排查求助

崩溃原因

  • 核心问题是ListView和ArrayAdapter的初始化时机错误:你将这两个变量作为类成员变量直接初始化,此时Activity还未执行onCreate生命周期方法,setContentView(R.layout.activity_add_ex)还没调用,布局没有加载完成,findViewById(R.id.Exerciselist)会返回空值,后续调用ex.setAdapter(arrayAdapter)时触发空指针异常直接崩溃。同时初始化ArrayAdapter时传入的this此时还不是有效Context,也会引发异常。
  • 次要问题:getIntent()获取参数的逻辑写在for循环内部,重复执行10次属于冗余操作,虽然不会直接导致崩溃,但会造成不必要的性能损耗。

修复后的代码

public class AddEx extends AppCompatActivity {

    public int max, min;
    public int w,m;
    public ArrayList<Object> exer = new ArrayList<>();
    public ArrayList<Integer> ans = new ArrayList<>();
    // 先只声明变量,不初始化
    public ListView ex;
    public ArrayAdapter<Object> arrayAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_ex);
        
        // setContentView之后再初始化View和Adapter
        ex = findViewById(R.id.Exerciselist);
        arrayAdapter = new ArrayAdapter<>(this, android.R.layout.select_dialog_item, exer);
        
        start();
    }

    public void start()
    {
        // 把获取Intent的逻辑移到for循环外面,只执行一次
        Intent intent = getIntent();
        int Token = Integer.parseInt(intent.getStringExtra(Add_Subtract.MSG));

        if(Token == 1)
        {
            max = 9;
            min = 1;
        }
        else if(Token == 2)
        {
            max = 99;
            min = 10;
        }
        else if(Token == 3)
        {
            max = 999;
            min = 100;
        }
        else if(Token == 4)
        {
            max = 9999;
            min = 1000;
        }
        else if(Token == 5)
        {
            max = 99999;
            min = 10000;
        }
        
        for (int i = 0; i<=9; i++)
        {
            w = ((int) Math.floor(Math.random() * (max - min + 1) + min));
            m = (int)Math.floor(Math.random() * (max - min + 1) + min);
            ans.add(w+m);
            exer.add(w+" + "+m);
        }
        ex.setAdapter(arrayAdapter);
    }

    public void answers(View view)
    {
        for (int i = 0; i<=9; i++)
        {
            Object ques = exer.get(i);
            exer.set(i, ques+" = "+ans.get(i));
        }
        ex.setAdapter(arrayAdapter);
    }
}

内容的提问来源于stack exchange,提问作者user14793600

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 02:24:04