保存字符串时SharedPreferences nullPointerException

时间:2015-06-29 12:54:36

标签: java android

我正在为Android安装启动器。目前我正在为地址簿工作(是的,我想将它包含在我的启动器中),但我得到了nullPointerExeption。 这是我的主框架的一部分,其中调用导致错误的类。

Numbers j = new Numbers();
                   EditText text = (EditText) findViewById(R.id.Number);
                   j.adNumber(text.getText().toString(), "1");

这是数字类

public class Numbers extends Activity {
SharedPreferences pres;



public void adNumber(String number, String button){
    SharedPreferences  pres;

    pres = getSharedPreferences("1",0);
 SharedPreferences.Editor editor = pres.edit();
editor.putString(number,button);
editor.commit();
 }

  public String getNumber(String button){
  pres = getSharedPreferences("1",0);
  return pres.getString(button,"");
 }
}

以下是错误消息:

06-29 12:51:39.476    8983-8983/oo.seniorlauncher.com.o_seniorlauncher E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: oo.seniorlauncher.com.o_seniorlauncher, PID: 8983
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference
        at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:170)
        at oo.seniorlauncher.com.o_seniorlauncher.Numbers.<init>(Numbers.java:26)
        at oo.seniorlauncher.com.o_seniorlauncher.MainFrame$1$1.onClick(MainFrame.java:46)
        at android.view.View.performClick(View.java:4780)
        at android.view.View$PerformClick.run(View.java:19866)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5257)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

提前致谢。

4 个答案:

答案 0 :(得分:3)

NPE是因为Numbers是一个活动但没有有效的上下文(或者更确切地说,不是一个)。

看起来你所做的是使你的Numbers类扩展Activity,以便你可以在其上调用getSharedPreferences。但是,您不能在Android中新建一个活动,您必须根据proper Activity life cycle创建它。

如果您希望能够在数字类中调用getSharedPreferences,则可以删除extends Activity,添加Context成员变量,并在构造函数中初始化它。 / p>

public class Numbers
{
     Context mContext;
     public Numbers(Context context)
     {
         mContext = context;
     }

然后你可以在上面调用getSharedPreferences:

     pres = mContext.getSharedPreferences("1",0);

答案 1 :(得分:1)

您可以两次声明ShardPreference个对象。 1.班级 2.在adNumber()。

所以,请删除其中一个,然后使用startup声明。

SharedPreferences pres = getApplicationContext().getSharedPreferences("MyPres", MODE_PRIVATE); 

并在任何地方使用它是你在课堂级别声明它。

答案 2 :(得分:0)

如果您使用editor.putString(number,button);,&#39;号码&#39;是你的钥匙和按钮&#39;是你的默认值。

如果您想检索&#39;数字&#39;的值在您的SharedPreferences中,您应该致电getString(key, defValue),如下所示:

return pres.getString(number, "");

答案 3 :(得分:0)

阅读thisthis

您已经声明了两倍的SharedPreferences变量。

此外,您只需拨打getSharedPreference(String, int)一次,如果您需要访问特定的共享变量,则只需pres.getString(label, default_value)