首页 > 解决方案 > 我得到 java.lang.NullPointerException: Attempt to invoke virtual method 当我在我的应用程序中保存详细信息时

问题描述

我想从 EnterDetails 类中输入详细信息并在 MainActivity 中查看保存的详细信息。

public class MainActivity extends AppCompatActivity {
EditText nameBox ;
EditText sclBox;
Spinner genderMenu;
EditText ageBox;
SharedPreferences sharedPref;
TextView label ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    nameBox = findViewById(R.id.editText);
    sclBox = findViewById(R.id.editText3);
    ageBox = findViewById(R.id.editText2);
    genderMenu = findViewById(R.id.spinner);
    sharedPref = getSharedPreferences("mypref",Context.MODE_PRIVATE);
    label = findViewById(R.id.textView);

    if(isDetailsEmpty(0)){
        label.setText("Enter new Details");

    }else{
        setDetails();
    }

}

public  boolean isDetailsEmpty(int i){


    if(i ==0) {
        if (sharedPref.getString("txtName", "").isEmpty() || sharedPref.getString("txtAge", "").isEmpty() || sharedPref.getString("txtScl", "").isEmpty()) {
            return true;

        } else {
            return false;
        }
    }{
        if(nameBox.getText().toString().isEmpty() || ageBox.getText().toString().isEmpty() || sclBox.getText().toString().isEmpty()){
            return true;
        }else{
            return false;
        }
    }
}

public void setDetails(){
    label.setText("Name : " +sharedPref.getString("txtName","Default")+"\n"+
            "Age : " +sharedPref.getString("txtAge","Default")+"\n"+
            "Gender : " +sharedPref.getString("optGender","Default")+"\n"+
            "School : " +sharedPref.getString("txtScl","Default")+"\n");

}

public void onClickLoadIntent(View v){
    Intent enterDet = new Intent(this, EnterDetails.class);
    startActivity(enterDet);
}

}

`公共类 EnterDetails 扩展 MainActivity {

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

public void onClickSave(View v){
    if(isDetailsEmpty(1)) {
        Toast.makeText(EnterDetails.this,"Empty Details!", Toast.LENGTH_SHORT).show();
    }else{
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString("txtName", nameBox.getText().toString());
        editor.putString("txtAge", ageBox.getText().toString());
        editor.putString("optGender", genderMenu.getSelectedItem().toString());
        editor.putString("txtScl", sclBox.getText().toString());
        editor.commit();
        Toast.makeText(EnterDetails.this,"Saved", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(this,MainActivity.class));

    }
}

} `

我想从 EnterDetails 类中输入详细信息并在 MainActivity 中查看保存的详细信息。但我得到以下错误。

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.userdetails, PID: 31945
java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
    at android.view.View.performClick(View.java:5646)
    at android.view.View$PerformClick.run(View.java:22473)
    at android.os.Handler.handleCallback(Handler.java:761)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:156)
    at android.app.ActivityThread.main(ActivityThread.java:6517)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
    at android.view.View.performClick(View.java:5646) 
    at android.view.View$PerformClick.run(View.java:22473) 
    at android.os.Handler.handleCallback(Handler.java:761) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:156) 
    at android.app.ActivityThread.main(ActivityThread.java:6517) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
    at com.example.userdetails.MainActivity.isDetailsEmpty(MainActivity.java:64)
    at com.example.userdetails.EnterDetails.onClickSave(EnterDetails.java:20)
    at java.lang.reflect.Method.invoke(Native Method) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
    at android.view.View.performClick(View.java:5646) 
    at android.view.View$PerformClick.run(View.java:22473) 
    at android.os.Handler.handleCallback(Handler.java:761) 
    at android.os.Handler.dispatchMessage(Handler.java:98) 
    at android.os.Looper.loop(Looper.java:156) 
    at android.app.ActivityThread.main(ActivityThread.java:6517) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 

如何解决这个问题?我已经将 EnterDetails 扩展到 MainActivity。

类似问题:什么是 NullPointerException,我该如何解决?

标签: javaandroid

解决方案


你在做什么是错误的。EnterDetails有自己的布局称为R.layout. enter_details,因此当您设置 时setContentView(R.layout.enter_details);,它将覆盖整个内容,因此MainActivity不再可以访问所有视图和布局。您需要做的是EnterDetails正常实现并用于Intent在活动之间发送数据。

public class EnterDetails extends AppCompatActivity {

    private boolean isDetailsEmpty = false;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.enter_details);
        isDetailsEmpty = getIntent().getBooleanExtra("test1", false)
    }

    public void onClickSave(View v){
        if(isDetailsEmpty) {
        ...
    }
}

并从您的MainActivity

public void onClickLoadIntent(View v){
    Intent enterDet = new Intent(this, EnterDetails.class);
    enterDet.putExtra("test1", isDetailsEmpty(1))
    startActivity(enterDet);
}

最后,请对 Activity 的工作原理进行更多研究https://medium.com/@peterekeneeze/passing-data-between-activities-2d0ef122f19d


推荐阅读