保存字符串时SharedPreferences nullPointerException

我正在为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.(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) 

提前致谢。

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

看起来你所做的是让你的Numbers类扩展Activity,这样你就可以调用它的getSharedPreferences 。 但是,您不能只在Android中创建一个Activity,您必须根据正确的Activity生命周期创建它。

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

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

然后你可以调用它的getSharedPreferences:

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

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

所以,请删除其中之一,并在启动时声明如下。

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

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

如果使用editor.putString(number,button); ,’number’是您的密钥,’button’是您的默认值。

如果要在SharedPreferences中检索“number”的值,则应调用getString(key, defValue) ,如下所示:

return pres.getString(number, "");

阅读本文和此内容

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

您还需要只调用getSharedPreference(String, int) ,如果需要访问特定的共享变量,则只需要pres.getString(label, default_value)