Android中SharedPreferences出现NullPointerException的解决办法

本文介绍了解决Android Service组件中出现的NullPointerException问题。错误出现在尝试从Service访问由Activity创建的Preferences文件时。通过将获取SharedPreferences实例的操作从成员变量初始化移至onCreate()方法内,成功解决了该异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天写Service组件的时候,莫名其妙老出现NullPointerException异常,主要经过是这样的:在Activity中创建Preferences文件,然后在Service中使用这个文件,出错的源代码如下:

1 import android.app.Service;
2  import android.content.Intent;
3  import android.content.SharedPreferences;
4  import android.content.SharedPreferences.Editor;
5 import android.os.IBinder;
6 import android.preference.PreferenceManager;
7
8 public class DemoService extends Service {
9
10 private static final String MONITOR_RUN_STATE = "MonitorRunState";
11 private SharedPreferences preferences = 
      PreferenceManager.getDefaultSharedPreferences(this);
12
13 @Override
14 public IBinder onBind(Intent arg0) {
15 return null;
16 }
17
18 @Override
19 public void onCreate() {
20 Editor editor = preferences.edit();
21 editor.putBoolean(MONITOR_RUN_STATE, true);
22 editor.commit();
23 super.onCreate();
24 }
25 }

执行的话会在11行出现空指针异常。

结果google半天后发现问题所在, PreferenceManager.getDefaultSharedPreferences(this)这句话不应该放在初始化Service类或子类的成员变量中,也就是说,应该把它放在onCreate()函数中,上面代码可以改成这样:

import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.IBinder;
import android.preference.PreferenceManager;

public class DemoService extends Service {

private static final String MONITOR_RUN_STATE = "MonitorRunState";
private SharedPreferences preferences = null;

@Override
public IBinder onBind(Intent arg0) {
return null;
}

@Override
public void onCreate() {
preferences
= PreferenceManager.getDefaultSharedPreferences(this);
Editor editor
= preferences.edit();
editor.putBoolean(MONITOR_RUN_STATE,
true);
editor.commit();
super.onCreate();
}
}

其中红字是更改过的地方。

不光是Service,Activity也应该这样,否则都会出现异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值