【问题标题】:Null pointer exception in SharedPreferences AndroidSharedPreferences Android中的空指针异常
【发布时间】:2012-08-07 13:43:23
【问题描述】:

这是我的 SharedPreference 类:

public class MySharedPrefs {
private static final String APP_SHARED_PREFS = "com.astroved.Horawatch";
private SharedPreferences appSharedPrefs;
private Editor prefsEditor;

public MySharedPrefs(Context context)
{
    this.appSharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE);
    this.prefsEditor = appSharedPrefs.edit();
}

public String getPrefsValue(String value) {
    return appSharedPrefs.getString(value, "");
}

public void savePrefsValue(String key , String Value) {
    prefsEditor.putString(key, Value);
    prefsEditor.commit();
}

public Boolean checkKey(String Key)
{
    if(appSharedPrefs.contains(Key))
        return true;    
    else
        return false;
}

}

我的函数类:

public class Functions_class extends Activity{


AstroVedTime tz,lat,lon;
TimeZone tz1;
protected MySharedPrefs appPrefs;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);{
        appPrefs = new MySharedPrefs(Functions_class.this);
    }
    }

public void user_informations(int myear,int mMonth, int mDay){

    int year = myear,month = mMonth+1,day = mDay;
    Moment mn = new Moment(year,month,day,user_device_time());
    //appPrefs = new MySharedPrefs(Functions_class.this);

    if(appPrefs.checkKey("City_name1")){
        TimeZone.setDefault(TimeZone.getTimeZone(appPrefs.getPrefsValue("selected_time_zone")));
        Log.v("LOG_TAG"+"here the error is : ", appPrefs.getPrefsValue("selected_lat")+"");
        Log.v("LOG_TAG", appPrefs.getPrefsValue("selected_longi")+"");
        tz1 = TimeZone.getDefault();
        lat = new AstroVedTime(Double.parseDouble(appPrefs.getPrefsValue("selected_lat")));// Latitude
        lon = new AstroVedTime(Double.parseDouble(appPrefs.getPrefsValue("selected_longi")));// Longitude
    }

这是我的logcat

 08-10 14:07:14.947: E/AndroidRuntime(475): FATAL EXCEPTION: Thread-13
08-10 14:07:14.947: E/AndroidRuntime(475): java.lang.NullPointerException
08-10 14:07:14.947: E/AndroidRuntime(475):  at com.astroved.horawatch.Functions_class.user_informations(Functions_class.java:46)
08-10 14:07:14.947: E/AndroidRuntime(475):  at com.astroved.horawatch.HoraWatchActivity$13$1.run(HoraWatchActivity.java:1106)
08-10 14:07:16.628: E/WindowManager(475): Activity com.astroved.horawatch.HoraWatchActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@407f1950 that was originally added here
08-10 14:07:16.628: E/WindowManager(475): android.view.WindowLeaked: Activity com.astroved.horawatch.HoraWatchActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@407f1950 that was originally added here
08-10 14:07:16.628: E/WindowManager(475):   at android.view.ViewRoot.<init>(ViewRoot.java:258)
08-10 14:07:16.628: E/WindowManager(475):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
08-10 14:07:16.628: E/WindowManager(475):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
08-10 14:07:16.628: E/WindowManager(475):   at android.view.Window$LocalWindowManager.addView(Window.java:424)
08-10 14:07:16.628: E/WindowManager(475):   at android.app.Dialog.show(Dialog.java:241)
08-10 14:07:16.628: E/WindowManager(475):   at com.astroved.horawatch.HoraWatchActivity$13.onClick(HoraWatchActivity.java:1103)
08-10 14:07:16.628: E/WindowManager(475):   at android.view.View.performClick(View.java:2485)
08-10 14:07:16.628: E/WindowManager(475):   at android.view.View$PerformClick.run(View.java:9080)
08-10 14:07:16.628: E/WindowManager(475):   at android.os.Handler.handleCallback(Handler.java:587)
08-10 14:07:16.628: E/WindowManager(475):   at android.os.Handler.dispatchMessage(Handler.java:92)
08-10 14:07:16.628: E/WindowManager(475):   at android.os.Looper.loop(Looper.java:123)
08-10 14:07:16.628: E/WindowManager(475):   at android.app.ActivityThread.main(ActivityThread.java:3683)
08-10 14:07:16.628: E/WindowManager(475):   at java.lang.reflect.Method.invokeNative(Native Method)
08-10 14:07:16.628: E/WindowManager(475):   at java.lang.reflect.Method.invoke(Method.java:507)
08-10 14:07:16.628: E/WindowManager(475):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-10 14:07:16.628: E/WindowManager(475):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-10 14:07:16.628: E/WindowManager(475):   at dalvik.system.NativeStart.main(Native Method)

我收到上述错误。我在调用 SharedPreference 值时犯了一些错误。我无法弄清楚。以前我收到此错误

at android.content.contextwrapper.getsharedpreferences contextwrapper.java 146

我通过在OnCreate 中调用SharedPreferences 清除了上述错误。如何清除上面显示的Logcat 错误。我错在哪里?

我在另一个活动的 onclick 期间调用 MyFunctionClass 中的方法。如下所示

HoraWatchActivity:

public Functions_class func_cls = new Functions_class();
 private OnClickListener show_panchang_page = new OnClickListener(){

    public void onClick(View v) { 

        pbarDialog = new ProgressDialog( HoraWatchActivity.this );
        pbarDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pbarDialog.setMessage("Loading Panchang...");
        pbarDialog.show();
               Thread t = new Thread(){
                   public void run(){
                       func_cls.user_informations(mYear, mMonth, mDay); 
                       Message myMessage=new Message();
                       Bundle resBundle = new Bundle();
                       resBundle.putString("status", "SUCCESS"); 
                       myMessage.obj=resBundle;
                       handler.sendMessage(myMessage);
                   }
               };
              t.start();
    }
};

更快的回复对我有很大帮助。谢谢。

【问题讨论】:

  • 我认为错误在于 HoraWatchActivity.java 。不是你在这里张贴的那个人。
  • @AndroSelva:在 HoraWatchActivity 中,我只是调用了 MyFunctionClass 中的方法。错误显示在 if(appPrefs.checkKey("City_name1")).... 所以我认为错误是检索 SharedPreference 值。我说的对吗?
  • 你能把那部分也发一下吗?对事物进行排序会很有帮助。
  • 是的。我已经更新了我的问题
  • func_cls 初始化了吗?

标签: android nullpointerexception sharedpreferences


【解决方案1】:

您正在手动实例化活动类 Functions_class。如果您启动活动,框架将处理此问题。即使 Functions_class 没有被用作活动,您也必须手动调用 Functions_class 的 oncreate。那就是初始化 appPrefs 的地方。 user_informations 函数中的 appPrefs 为空。初始化它。

【讨论】:

  • 我已经在 user_information 中初始化了 appPrefs。只有在 tat 时间我得到了 at android.content.contextwrapper.getsharedpreferences contextwrapper.java 146 错误。所以我在 OnCreate 中初始化。我直接从另一个函数调用 user_informations 函数。这不会在 Func_class 的 Oncreate 中初始化 appPrefs。如何启动?
  • 你是正确的。我明白了。谢谢 :)
【解决方案2】:

我认为你的方法是错误的,因为你正在调用 Activity 的方法 (iefunc_cls.user_informations(mYear, mMonth, mDay);) 不是可见 Activity (HoraWatchActivity.this) 的焦点.. 和那个函数除了从共享偏好中获取价值外,什么都不做。数据检索应在 NonActivity 类中完成。appPrefs 为 null 未初始化。

【讨论】:

    【解决方案3】:

    好的,找到问题了。问题在于这个变量,appPrefs 在你的Function classuser_informations 中。那时它是空的。

    你所做的是,你已经在onCreate()中启动了appPrefs,但是当你这样做时,public Functions_class func_cls = new Functions_class();你的onCreate没有被调用,这意味着它直接进入方法并返回null给你。您必须对现有代码进行一些修改。

    试试这个,

    1)首先将您的当前活动上下文传递给您的方法,

    2)在方法appPrefs = new MySharedPrefs(context);中取消注释这一行

    public void user_informations(int myear,int mMonth, int mDay,Context context){
    
        int year = myear,month = mMonth+1,day = mDay;
        Moment mn = new Moment(year,month,day,user_device_time());
        appPrefs = new MySharedPrefs(context);
    
        if(appPrefs.checkKey("City_name1")){
            TimeZone.setDefault(TimeZone.getTimeZone(appPrefs.getPrefsValue("selected_time_zone")));
            Log.v("LOG_TAG"+"here the error is : ", appPrefs.getPrefsValue("selected_lat")+"");
            Log.v("LOG_TAG", appPrefs.getPrefsValue("selected_longi")+"");
            tz1 = TimeZone.getDefault();
            lat = new AstroVedTime(Double.parseDouble(appPrefs.getPrefsValue("selected_lat")));// Latitude
            lon = new AstroVedTime(Double.parseDouble(appPrefs.getPrefsValue("selected_longi")));// Longitude
        }
    

    【讨论】:

    • 嗯。再次谢谢你..所以我没有通过上下文。我明白了:)
    猜你喜欢
    • 2015-08-28
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多