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
相关产品推荐
相关产品推荐

