【问题标题】:NullPointerException when reading from Database [duplicate]从数据库读取时出现 NullPointerException [重复]
【发布时间】:2017-01-24 19:13:27
【问题描述】:

我正在构建一个联系人应用程序并为其创建了一个数据库。每次我运行它时,它都会显示下面的异常。

logcat 错误示例:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
        at com.example.joey.sqlite.MainActivity.onResume(MainActivity.java:48)
        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
        at android.app.Activity.performResume(Activity.java:6076)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3039)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3081) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2447) 
        at android.app.ActivityThread.access$800(ActivityThread.java:156) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:211) 
        at android.app.ActivityThread.main(ActivityThread.java:5389) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 

我该如何解决?

报错在for循环中:

@Override
protected void onResume() {

    DBHelper dbHelper = new DBHelper(this);

    namesList = new ArrayList<String>();
    for (int i=0; i< dbHelper.getAllContacts().size();i++){
        namesList.add(dbHelper.getAllContacts().get(i).getName());
    }

    adapter = new ArrayAdapter(getApplicationContext(),android.R.layout.simple_list_item_1,namesList);

    list.setAdapter(adapter);
    super.onResume();
}

数据库读取方法示例:

public ArrayList<Contact> getAllContacts() {
    SQLiteDatabase db = this.getReadableDatabase();
    ArrayList<Contact> contactArrayList = new ArrayList<Contact>();

    Cursor cur = db.rawQuery("select * from " + TABLE,null);
    cur.moveToFirst();
    while (cur.isAfterLast() == false) {
        try {
            Contact contact_new =  new Contact();
            contact_new.setName(cur.getString(cur.getColumnIndex(NAME)));
            contact_new.setEmail(cur.getString(cur.getColumnIndex(EMAIL)));
            contact_new.setPhone(cur.getString(cur.getColumnIndex(PHONE)));

            contactArrayList.add(contact_new);
            cur.moveToNext();

            return contactArrayList;

        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
    return null;
}

【问题讨论】:

  • 因为您的日志 cat 显示您的 arraylist 正在返回 null ,所以首先检查 contactArrayList 是否不为 null,然后将 contactArrayList 公开。
  • @MayankBhatnagar 您的数组列表返回 null arraylist 可能为 null 或 arraylist 的某些方法可能返回 null 您的 arraylist 正在返回 null 意味着什么
  • 你的 getAllContacts 实现也没有意义,因为循环内有 return 语句

标签: java android sqlite nullpointerexception android-sqlite


【解决方案1】:

如果你的数据库请求返回 null,只需在你的 for 循环上方添加这个检查以避免崩溃:

if (dbHelper.getAllContacts() != null) {
    for(...) {...}
} 

【讨论】:

  • 谢谢。我已经尝试了所有建议,但似乎没有奏效。任何进一步的帮助将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多