Java SQLite游标处的NullPointerException

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

我在我的Google Play控制台中收到了这个崩溃报告。我从未在自己的设备和模拟器上经历过这样的崩溃

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){ ... }