Java SQLite游标处的NullPointerException
我在我的Google Play控制台中收到了这个崩溃报告。我从未在自己的设备和模拟器上经历过这样的崩溃Java SQLite游标处的NullPointerException,java,android,Java,Android,我在我的Google Play控制台中收到了这个崩溃报告。我从未在自己的设备和模拟器上经历过这样的崩溃 Caused by: java.lang.NullPointerException: at android.preference.PreferenceManager.getDefaultSharedPreferencesName (PreferenceManager.java:498) at android.preference.PreferenceManager.getDefaul
Caused by: java.lang.NullPointerException:
at android.preference.PreferenceManager.getDefaultSharedPreferencesName (PreferenceManager.java:498)
at android.preference.PreferenceManager.getDefaultSharedPreferences (PreferenceManager.java:487)
at DictionaryDB2.getHistoryWords (DictionaryDB2.java)
or .hasObject (DictionaryDB2.java)
这是getHistoryWords
public List<Bean> getHistoryWords() {
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MyApp.getAppContext());
String historyNum = SP.getString("history","50");
SQLiteDatabase db = initializer.getReadableDatabase();
String sql = "SELECT * FROM " + HISTORY_NAME +
" WHERE " + STATUS + " ORDER BY " + STATUS + " DESC LIMIT " + historyNum ;
Cursor cursor = db.rawQuery(sql, null);
List<Bean> wordList = new ArrayList<Bean>();
while(cursor.moveToNext()) {
int id = cursor.getInt(0);
String english = cursor.getString(1);
String malay = cursor.getString(2);
wordList.add(new Bean(id, english, malay));
}
cursor.close();
db.close();
return wordList;
}
如何解决此问题?我建议您添加一个上下文参数,并从主活动传递该参数,而不是在
getHistoryWords()中使用对应用程序上下文的静态引用
public List<Bean> getHistoryWords(Context context) {
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(context);
...
}
public List getHistoryWords(上下文){
SharedReferences SP=PreferenceManager.GetDefaultSharedReferences(上下文);
...
}
然后在主要活动中
public void onCreate( Bundle savedInstanceState ) {
setContentView( ... );
...
List<Bean> beans = getHistoryWords( getApplicationContext() );
...
}
public void onCreate(Bundle savedInstanceState){
setContentView(…);
...
列表bean=getHistoryWords(getApplicationContext());
...
}
您的问题在于如何获取首选项管理器的上下文
问题1:
不要使用对上下文的静态引用,我敢肯定Android Studio会就此向您发出警告
问题2:
如果您存储的上下文是一个静态变量,即使它是ApplicationContext,如果在手机内存不足的情况下,当垃圾收集器运行时,它将被设置为null
只需将上下文传递给希望使用它的方法,并在调用它时获取应用程序上下文
例如:
myMethod(getApplicationContext()); // Application context
myMethod(this); //In case you call from Activity
myMethod(getActivity()); //In case you call from Fragment
用于:
发布您的PreferenceManager.java
@SantanuSur,这是一个Android框架类,因此OP无法编辑。我猜这是从语句SP.getString(“history”,“50”)代码>关于此崩溃报告来自哪种设备的任何信息?还有一件事需要补充。在我将目标sdk从25升级到25之前,我没有收到此类崩溃报告27@MichaelDodd受影响最大的两个设备是nova 2i(HWRNE)和Y7(HWTRT-Q)。您有任何实施示例吗?谢谢。我会试试这是否能解决问题。我已经发布了我的应用程序的更新和你的建议。我的应用已经上线24小时了,我没有收到类似的崩溃报告。我认为这可以解决问题。非常感谢。
myMethod(getApplicationContext()); // Application context
myMethod(this); //In case you call from Activity
myMethod(getActivity()); //In case you call from Fragment
public void myMethod(Context context){ ... }