【问题标题】:getting error in android application: Attempt to invoke interface method on a null object reference在 android 应用程序中出现错误:尝试在空对象引用上调用接口方法
【发布时间】:2015-01-05 04:55:43
【问题描述】:

我在 radiogroup 中有三个单选按钮并且想要,当用户检查任何单选按钮时,它必须保持选中状态,直到用户检查任何其他按钮(用户关闭应用程序或不关闭应用程序),为此我使用了 sharedPreferences 来存储它选中复选框值并在加载活动时检索,但在加载活动以选择复选框时出现错误。下面是我的代码。

Activity.java:

public static SharedPreferences pref;
public static String lang;
public static String chk;
public static RadioButton gujarati;
public static RadioButton hindi;
public static RadioButton english;
public static EditText txtV;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.select_language);
//  
//  String chk = pref.getString("key_name", null);
//  if(chk=="Gujarati"){
//      gujarati.setChecked(true);
//  }
//  else if(chk=="Hindi"){
//      hindi.setChecked(true);
//  }
//  else{
    //  english.setChecked(true);
    //}
    //editor.remove("key_name3"); // will delete key key_name3
    //editor.remove("key_name4"); // will delete key key_name4

    // Save the changes in SharedPreferences
    //editor.commit(); // commit changes
    //editor.clear();
     //editor.commit(); 

    RadioGroup group = (RadioGroup) findViewById(R.id.radioGroup1);
    gujarati = (RadioButton) findViewById(R.id.radio0);
    hindi = (RadioButton) findViewById(R.id.radio1);
    english = (RadioButton) findViewById(R.id.radio2);
    txtV = (EditText) findViewById(R.id.editText1);

    //int radio_selected = getSharedPreferences("your_prefs", Activity.MODE_PRIVATE).getInt("my_selected_radio",0);
    //int radio_selected = getSharedPreferences("your_prefs", Activity.MODE_PRIVATE).edit().putInt("my_selected_radio",selectedValue).commit();
    chk = pref.getString("key_name", null);

    if(chk == "Gujarati"){
        gujarati.setChecked(true);
    }
    if(chk == "Hindi"){
        hindi.setChecked(true);
    }
    if(chk == "English"){
        english.setChecked(true);
    }

    group.setOnCheckedChangeListener(new OnCheckedChangeListener(){

        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // TODO Auto-generated method stub
            if(checkedId == R.id.radio0) {
                lang = "Gujarati";
                pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
                Editor editor = pref.edit();
                editor.putString("key_name", lang);
                editor.commit();
                chk = pref.getString("key_name", null);
                txtV.setText(chk);

            } else if(checkedId == R.id.radio1) {
                lang = "Hindi";
                pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
                Editor editor = pref.edit();
                editor.putString("key_name", lang);
                editor.commit();
                chk = pref.getString("key_name", null);
                txtV.setText(chk);
            } else {
                lang = "English";
                pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
                Editor editor = pref.edit();
                editor.putString("key_name", lang);
                editor.commit();
                chk = pref.getString("key_name", null);
                txtV.setText(chk);

            }

        }

    });

activity.xml:

<RadioGroup
    android:id="@+id/radioGroup1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView1"
    android:layout_marginTop="25dp" >

    <RadioButton
        android:id="@+id/radio0"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="RadioButton" />

    <RadioButton
        android:id="@+id/radio1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="RadioButton" />

    <RadioButton
        android:id="@+id/radio2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="RadioButton" />
</RadioGroup>


<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/radioGroup1"
    android:layout_below="@+id/radioGroup1"
    android:layout_marginLeft="15dp"
    android:ems="10" >

    <requestFocus />
</EditText>

Logcat:

01-05 04:21:35.055: E/AndroidRuntime(2665): FATAL EXCEPTION: main
01-05 04:21:35.055: E/AndroidRuntime(2665): Process: com.finaldbparse.finaldbparse, PID: 2665
01-05 04:21:35.055: E/AndroidRuntime(2665): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.finaldbparse.finaldbparse/com.finaldbparse.finaldbparse.SelectLanguage}: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String android.content.SharedPreferences.getString(java.lang.String, java.lang.String)' on a null object reference
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.os.Looper.loop(Looper.java:135)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.main(ActivityThread.java:5221)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at java.lang.reflect.Method.invoke(Native Method)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at java.lang.reflect.Method.invoke(Method.java:372)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
01-05 04:21:35.055: E/AndroidRuntime(2665): Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String android.content.SharedPreferences.getString(java.lang.String, java.lang.String)' on a null object reference
01-05 04:21:35.055: E/AndroidRuntime(2665):     at com.finaldbparse.finaldbparse.SelectLanguage.onCreate(SelectLanguage.java:55)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.Activity.performCreate(Activity.java:5933)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
01-05 04:21:35.055: E/AndroidRuntime(2665):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
01-05 04:21:35.055: E/AndroidRuntime(2665):     ... 10 more

【问题讨论】:

  • 请同时发布您的 logcat 错误。

标签: android nullpointerexception sharedpreferences android-radiogroup android-radiobutton


【解决方案1】:

这里:

chk = pref.getString("key_name", null);

1. 您不是在初始化prefSharedPreferences 实例,而是在调用getString 方法。这样做:

pref = getApplicationContext().getSharedPreferences("MyPref", 0); 
chk = pref.getString("key_name", null);

2. 使用String.equals 代替== 比较字符串

3.onCreate 方法中初始化pref 然后不需要像目前在setOnCheckedChangeListener 中所做的那样再次初始化

【讨论】:

    【解决方案2】:

    您已经实现了一个onCheckedChangeListener 事件,只要您的活动开始,它就会自动调用。所以出现的问题是,虽然您的 sharedpreference 值是正确的,但之后您的 CheckedChangeListener 立即被调用,因此您从偏好中获得的值被重置并且您得到的结果不正确。

    这就是为什么每当您要检查另一个单选按钮时,我都会删除旧值。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.select_language);
    
        group.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                // TODO Auto-generated method stub
                pref = getApplicationContext().getSharedPreferences("MyPref", 0);
                Editor editor1 = pref.edit();
                editor1.remove("key_name");
                if (checkedId == R.id.radio0) {
                    lang = "Gujarati";
                    pref = getApplicationContext().getSharedPreferences("MyPref", 0);
                    Editor editor = pref.edit();
                    editor.putString("key_name", lang);
                    editor.commit();
                    // chk = pref.getString("key_name", null);
                    txtV.setText(lang);
    
                } else if (checkedId == R.id.radio1) {
                    lang = "Hindi";
                    pref = getApplicationContext().getSharedPreferences("MyPref", 0);
                    Editor editor = pref.edit();
                    editor.putString("key_name", lang);
                    editor.commit();
                    // chk = pref.getString("key_name", null);
                    txtV.setText(lang);
                } else if (checkedId == R.id.radio2) {
                    lang = "English";
                    pref = getApplicationContext().getSharedPreferences("MyPref", 0);
                    Editor editor = pref.edit();
                    editor.putString("key_name", lang);
                    editor.commit();
                    // chk = pref.getString("key_name", null);
                    txtV.setText(lang);
    
                }
            }
    
        });
    
        pref = getApplicationContext().getSharedPreferences("MyPref", 0);
        chk = pref.getString("key_name", null);
        System.err.println("Get value is=====" + chk);
        if (chk != null) {
            if (chk.equals("Gujarati")) {
                gujarati.setChecked(true);
            }
            if (chk.equals("Hindi")) {
                hindi.setChecked(true);
            }
            if (chk.equals("English")) {
                english.setChecked(true);
            }
        }
    }
    

    【讨论】:

    • if(chk == "Gujarati") 无效,如果我们要比较字符串变量值
    • 我已经添加了你的代码,但是当我重新启动它时,应用程序仍然忘记了有关选中的单选按钮的所有状态。
    • 我认为在将您选择的复选框值存储到 sharedpreference 之后,您不需要再次从中获取它以将其设置到您的 TextView 中,因为您的 String 中的每个选定按钮都有值setOnCheckedChangeListener 方法。您只能直接使用该字符串值。
    • 我试过你的代码,但是重启我的应用程序后它又忘记了选中的复选框,请帮助我。
    • @RaviBhalodiya 现在试试我的代码,我已经更新了它。它现在工作正常。
    【解决方案3】:

    你得到了NPE,因为pref=NULL

    chk = pref.getString("key_name", null);

    在使用之前初始化pref。喜欢

    pref = getApplicationContext().getSharedPreferences("MyPref", 0); in onCreate(....)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      相关资源
      最近更新 更多