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

Android应用诊断模块崩溃:EditText空对象引用问题求助

解决诊断模块的NullPointerException崩溃问题

你的崩溃原因非常明确:你在Questions Activity里尝试获取一个属于answers Activity布局的控件,导致findViewById返回null,调用getText()时触发空指针异常。

具体来说:

  • 你在Questions的diagnosispart()方法中调用了findViewById(R.id.textView16),但这个EditText控件是定义在activity_answers.xml布局里的,而Questions加载的是activity_questions.xml,所以找不到这个控件,返回null。
  • 同时,你的按钮点击事件里同时调用了opendiagnosis()和diagnosispart(),这两个方法都会启动answers Activity,不仅重复启动,还会在未验证控件存在的情况下执行获取文本的操作,直接触发崩溃。

修复步骤

1. 修正控件的归属(二选一)

情况A:这个EditText是让用户在Questions页面输入的

如果textView16是需要用户在回答问题时填写的内容,你需要把这个EditText的代码从activity_answers.xml移到activity_questions.xml中,这样Questions Activity就能正确找到它。

情况B:这个EditText是在answers页面显示内容的

如果textView16只是用来在answers页面展示数据的,那你完全不需要在Questions里获取它,直接把要传递的数据通过Intent传给answers即可,在answers里再设置文本。

2. 合并重复的Activity启动逻辑

删除按钮点击事件中重复的方法调用,只保留一个启动逻辑,并整合数据传递。

修改后的代码示例

修正后的Questions Activity代码

public class Questions extends AppCompatActivity { 
    private Button button2; 
    private RadioButton radioButton; 
    private RadioButton radioButton2; 
    private RadioButton radioButton3; 
    private RadioButton radioButton4; 
    private RadioButton radioButton5; 
    private RadioButton radioButton6; 
    private RadioButton radioButton7; 
    private RadioButton radioButton8; 
    private RadioButton radioButton9; 
    private RadioButton radioButton10; 
    private RadioButton radioButton11; 
    private RadioButton radioButton12; 
    private RadioButton radioButton13; 
    private RadioButton radioButton14; 
    private RadioButton radioButton15; 
    private RadioButton radioButton16; 
    private RadioButton radioButton17; 
    private RadioButton radioButton18; 
    // 如果是情况A,声明EditText
    private EditText inputEditText;

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_questions); 

        button2 = findViewById(R.id.button2); 
        // 如果是情况A,初始化EditText
        inputEditText = findViewById(R.id.textView16);

        button2.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                // 验证所有问题是否已回答
                boolean shouldStartNextActivity = (radioButton.isChecked() || radioButton2.isChecked()) 
                        && (radioButton3.isChecked() || radioButton4.isChecked()) 
                        && (radioButton5.isChecked() || radioButton6.isChecked()) 
                        && (radioButton7.isChecked() || radioButton8.isChecked())
                        && (radioButton9.isChecked() || radioButton10.isChecked()) 
                        && (radioButton11.isChecked() || radioButton12.isChecked())
                        && (radioButton13.isChecked() || radioButton14.isChecked()) 
                        && (radioButton15.isChecked() || radioButton16.isChecked())
                        && (radioButton17.isChecked() || radioButton18.isChecked()); 

                if (shouldStartNextActivity){ 
                    Intent intent = new Intent(Questions.this, answers.class); 
                    // 如果是情况A,传递用户输入的文本
                    String inputValue = inputEditText.getText().toString();
                    intent.putExtra("Value1", inputValue);
                    // 如果是情况B,直接传递预设数据或其他逻辑生成的数据
                    // intent.putExtra("Value1", "this is it");
                    startActivity(intent); 
                } else{ 
                    Toast.makeText(getBaseContext(), "Please answer all the questions for an accurate diagnosis", Toast.LENGTH_LONG).show(); 
                }
            } 
        }); 

        // 所有RadioButton的初始化代码保持不变
        //Question 1 
        radioButton = findViewById(R.id.radioButton); //yes 
        radioButton2 = findViewById(R.id.radioButton20); //no 
        //Question 2 
        radioButton3 = findViewById(R.id.radioButton4); //yes 
        radioButton4 = findViewById(R.id.radioButton2); //no 
        //Question 3 
        radioButton5 = findViewById(R.id.radioButton6); //yes 
        radioButton6 = findViewById(R.id.radioButton5); //no 
        //Question 4 
        radioButton7 = findViewById(R.id.radioButton7); //yes 
        radioButton8 = findViewById(R.id.radioButton8); //no 
        //Question 5 
        radioButton9 = findViewById(R.id.radioButton9); //yes 
        radioButton10 = findViewById(R.id.radioButton10); //no 
        //Question 6 
        radioButton11 = findViewById(R.id.radioButton12); //yes 
        radioButton12 = findViewById(R.id.radioButton11); //no 
        //Question 7 
        radioButton13 = findViewById(R.id.radioButton13); //yes 
        radioButton14 = findViewById(R.id.radioButton14); //no 
        //Question 8 
        radioButton15 = findViewById(R.id.radioButton15); //yes 
        radioButton16 = findViewById(R.id.radioButton16); //no 
        //Question 9 
        radioButton17 = findViewById(R.id.radioButton17); //yes 
        radioButton18 = findViewById(R.id.radioButton18); //no 
    } 

    // 删除原有的opendiagnosis()和diagnosispart()方法,逻辑已整合到点击事件中

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
        super.onSaveInstanceState(savedInstanceState); 
        savedInstanceState.putBoolean("myOption1", radioButton.isChecked()); 
        savedInstanceState.putBoolean("myOption2", radioButton2.isChecked()); 
        savedInstanceState.putBoolean("myOption3", radioButton3.isChecked()); 
        savedInstanceState.putBoolean("myOption4", radioButton4.isChecked()); 
        savedInstanceState.putBoolean("myOption5", radioButton5.isChecked()); 
        savedInstanceState.putBoolean("myOption6", radioButton6.isChecked()); 
        savedInstanceState.putBoolean("myOption7", radioButton7.isChecked()); 
        savedInstanceState.putBoolean("myOption8", radioButton8.isChecked()); 
        savedInstanceState.putBoolean("myOption9", radioButton9.isChecked()); 
        savedInstanceState.putBoolean("myOption10", radioButton10.isChecked()); 
        savedInstanceState.putBoolean("myOption11", radioButton11.isChecked()); 
        savedInstanceState.putBoolean("myOption12", radioButton12.isChecked()); 
        // 如果是情况A,保存EditText内容
        savedInstanceState.putString("inputText", inputEditText.getText().toString());
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
        super.onRestoreInstanceState(savedInstanceState); 
        radioButton.setChecked(savedInstanceState.getBoolean("myOption1")); 
        radioButton2.setChecked(savedInstanceState.getBoolean("myOption2")); 
        radioButton3.setChecked(savedInstanceState.getBoolean("myOption3")); 
        radioButton4.setChecked(savedInstanceState.getBoolean("myOption4")); 
        radioButton5.setChecked(savedInstanceState.getBoolean("myOption5")); 
        radioButton6.setChecked(savedInstanceState.getBoolean("myOption6")); 
        radioButton7.setChecked(savedInstanceState.getBoolean("myOption7")); 
        radioButton8.setChecked(savedInstanceState.getBoolean("myOption8")); 
        radioButton9.setChecked(savedInstanceState.getBoolean("myOption9")); 
        radioButton10.setChecked(savedInstanceState.getBoolean("myOption10")); 
        radioButton11.setChecked(savedInstanceState.getBoolean("myOption11")); 
        radioButton12.setChecked(savedInstanceState.getBoolean("myOption12")); 
        // 如果是情况A,恢复EditText内容
        inputEditText.setText(savedInstanceState.getString("inputText"));
    } 
}

answers Activity代码保持不变(兼容两种情况)

public class answers extends AppCompatActivity { 
    private Button button7; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_answers); 

        Bundle extras = getIntent().getExtras(); 
        if (extras != null) { 
            String value1 = extras.getString("Value1"); 
            if (value1 != null) { 
                TextView displayintentextra = findViewById(R.id.textView16); 
                displayintentextra.setText(value1); 
            } 
        } 

        button7 = findViewById(R.id.button7); 
        button7.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                reset(); 
            } 
        }); 
    } 

    public void reset() { 
        Intent intent = new Intent(this, Questions.class); 
        startActivity(intent); 
    } 
}

额外建议

  • 尽量给控件起有意义的名字,比如把textView16改成userInputEt或者diagnosisResultTv,这样能避免混淆控件的功能和归属。
  • 启动Activity时,使用当前Activity.this(比如Questions.this)作为Context,避免匿名内部类中Context的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:12:43