首页 > 解决方案 > 调用错误 EditText() 空对象引用

问题描述

我知道这可能是一个非常简单的解决方案,但我一辈子都无法让这部分代码为我的症状检查器工作。其他一切工作正常,但应用程序在诊断部分方法中完全崩溃。

这是导致问题的java文件的一部分(问题活动):

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;



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


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

    //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
}


public void opendiagnosis() {
    // for all pairs: one of each pair has to be checked
    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(this, answers.class);
        startActivity(intent);
    } else{
        Toast.makeText(getBaseContext(), "Please answer all the questions for an accurate diagnosis", Toast.LENGTH_LONG).show();
    }
}

public void diagnosispart() {
    EditText text = (findViewById(R.id.textView16));

    String value = text.getText().toString();

    Intent i = new Intent(this, answers.class);
    i.putExtra("Value1", "this is it");
    startActivity(i);

}

@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());
}

@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"));

}
}

然后将意图传递给答案活动,它的意思是在 textView16 中显示:

 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) {
        return;
    }

    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);
}

}

这是logcat所说的:

2020-01-30 08:07:37.581 20275-20275/com.example.mhtapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mhtapplication, PID: 20275
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
    at com.example.mhtapplication.Questions.onlick(Questions.java:103)

edittext 视图所基于的 XML 文件:

<EditText
android:id="@+id/textView16"
android:layout_width="384dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="12dp"
android:text=""
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView13" />

标签: javaandroidxml

解决方案


首先不需要为它添加额外的大括号 EditText text = (findViewById(R.id.textView16));
它可以写成

EditText text = findViewById(R.id.textView16);

还要确保您EditText在 xml 布局中作为您的视图,或者也请共享 xml 部分

text在从中获取文本之前,请确保您的视图中有文本

根据您更新的代码,请放在EditText text = (findViewById(R.id.textView16));后面setContentView(),然后重试。


推荐阅读