Android卡路里计数App打开CreateEntryActivity崩溃问题求助
我是Android开发新手,正在开发一款卡路里计数应用。从主界面打开「创建记录」(CreateEntryActivity)时,应用会立即崩溃,但仅保留XML布局时该界面可正常打开。以下是相关代码及Logcat日志,请求帮忙找出问题所在:
public class CreateEntryActivity extends AppCompatActivity { private Spinner spinnerFood; private EditText editTextGrams; private EditText editTextDate; private Button buttonSave; private Button buttonCreateFood; private List <Food> foods; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_entry); Food apple = new Food("Apple", 0.25, 0.5, 0.1, "None", 1); foods.add(apple); ArrayAdapter <Food> adapter = new ArrayAdapter < > (this, android.R.layout.simple_spinner_item, foods); spinnerFood.setAdapter(adapter); spinnerFood = findViewById(R.id.spinnerFoodEntry); editTextGrams = findViewById(R.id.editTextGramsEntry); editTextDate = findViewById(R.id.editTextDateEntry); buttonSave = findViewById(R.id.buttonSaveEntry); buttonCreateFood = findViewById(R.id.buttonCreateFood); buttonCreateFood.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(CreateEntryActivity.this, CreateFoodActivity.class); startActivity(intent); Intent i = getIntent(); Food food = (Food) i.getSerializableExtra("FOOD_KEY_"); foods.add(food); } }); } }
Logcat日志:
2024-06-24 12:19:09.975 26131-26131 AndroidRuntime com.curs.licenta_lungutudor D Shutting down VM 2024-06-24 12:19:09.979 26131-26131 AndroidRuntime com.curs.licenta_lungutudor E FATAL EXCEPTION: main (Ask Gemini) Process: com.curs.licenta_lungutudor, PID: 26131 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.curs.licenta_lungutudor/com.curs.licenta_lungutudor.CreateEntryActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference at com.curs.licenta_lungutudor.CreateEntryActivity.onCreate(CreateEntryActivity.java:52) at android.app.Activity.performCreate(Activity.java:8000) at android.app.Activity.performCreate(Activity.java:7984) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
问题分析与修复
核心崩溃原因
从Logcat日志可以明确,崩溃触发了空指针异常:
java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
对应代码里的问题有三处:
List未初始化
你仅声明了private List<Food> foods;,但未给它分配具体实例(比如ArrayList),直接调用foods.add(apple)必然触发空指针。控件初始化顺序错误
你先调用spinnerFood.setAdapter(adapter);,之后才通过findViewById获取spinner实例,这会导致另一个空指针——因为此时spinnerFood还是null。必须先获取控件对象,再设置适配器。页面跳转后的数据获取逻辑错误
在buttonCreateFood的点击事件里,你启动CreateFoodActivity后立刻调用getIntent()获取数据,这时候新页面还未返回,根本拿不到目标数据。正确做法是用startActivityForResult(或Jetpack的Activity Result API)接收返回数据。
修复后的代码示例
public class CreateEntryActivity extends AppCompatActivity { private Spinner spinnerFood; private EditText editTextGrams; private EditText editTextDate; private Button buttonSave; private Button buttonCreateFood; private List<Food> foods = new ArrayList<>(); // 初始化List @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_entry); // 先初始化所有控件 spinnerFood = findViewById(R.id.spinnerFoodEntry); editTextGrams = findViewById(R.id.editTextGramsEntry); editTextDate = findViewById(R.id.editTextDateEntry); buttonSave = findViewById(R.id.buttonSaveEntry); buttonCreateFood = findViewById(R.id.buttonCreateFood); // 添加示例数据并设置适配器 Food apple = new Food("Apple", 0.25, 0.5, 0.1, "None", 1); foods.add(apple); ArrayAdapter<Food> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, foods); spinnerFood.setAdapter(adapter); buttonCreateFood.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 使用startActivityForResult接收返回数据 Intent intent = new Intent(CreateEntryActivity.this, CreateFoodActivity.class); startActivityForResult(intent, 100); // 100为自定义请求码 } }); } // 接收CreateFoodActivity返回的数据 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100 && resultCode == RESULT_OK && data != null) { Food food = (Food) data.getSerializableExtra("FOOD_KEY_"); if (food != null) { foods.add(food); // 通知适配器数据更新,刷新Spinner ((ArrayAdapter)spinnerFood.getAdapter()).notifyDataSetChanged(); } } } }
额外注意事项
- 确保
Food类实现了Serializable接口,否则无法通过Intent传递对象。 - 若使用AndroidX,推荐用Activity Result API替代
startActivityForResult(后者已标记为过时)。
内容的提问来源于stack exchange,提问作者Tudor Lungu

