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

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

对应代码里的问题有三处:

  1. List未初始化
    你仅声明了private List<Food> foods;,但未给它分配具体实例(比如ArrayList),直接调用foods.add(apple)必然触发空指针。

  2. 控件初始化顺序错误
    你先调用spinnerFood.setAdapter(adapter);,之后才通过findViewById获取spinner实例,这会导致另一个空指针——因为此时spinnerFood还是null。必须先获取控件对象,再设置适配器。

  3. 页面跳转后的数据获取逻辑错误
    在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:32:33