SQLite游标的空指针异常

4

我在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;
    }

这是MyApp
public class MyApp extends Application {  

    private static Context context;

    public void onCreate() {
        super.onCreate();
        MobileAds.initialize(this, "my admob ");
        MyApp.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return MyApp.context;
    }
}

如何解决这个问题?

请发布您的 PreferenceManager.java 文件。 - Santanu Sur
@SantanuSur 这是一个Android框架类,因此OP无法进行编辑。 我猜测这是由语句SP.getString("history","50");引起的。 - Michael Dodd
这个崩溃报告来自什么类型的设备? - Michael Dodd
还有一件事要补充。在将目标SDK从25升级到27之前,我没有收到这样的崩溃报告。 - user2872856
糟糕,我以为那是他的自定义类 @MichaelDodd :p..但还是要检查上下文哦..!! :) - Santanu Sur
显示剩余7条评论
2个回答

0

getHistoryWords()中,不要使用静态引用来获取应用上下文,我建议您添加一个上下文参数,并从主活动传递该参数。

public List<Bean> getHistoryWords(Context context) {
    SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(context);
    ...
}

然后在主活动中...

public void onCreate( Bundle savedInstanceState ) {
    setContentView( ... );
    ...
    List<Bean> beans = getHistoryWords( getApplicationContext() );
    ...
}

你有任何实现的例子吗? - user2872856
谢谢。我会尝试看看这是否解决了问题。 - user2872856
我已经根据您的建议发布了我的应用程序更新。 我的应用已经上线了大约24个小时,我没有收到相似的崩溃报告。 我认为这解决了问题。 谢谢你。 - user2872856

0

你的问题在于获取Preference Manager的上下文方式不正确。

问题1:

不要使用静态引用Context,我相信Android Studio会对此发出警告。

问题2:

如果你将Context存储为静态变量,即使它是ApplicationContext,在手机内存不足时,当垃圾回收器运行时,它也会被设置为null。

只需将Context传递给您希望使用它的方法,并在调用时获取应用程序上下文即可。

例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接