Loading

空指针异常-今天练习时遇到的问题

今天写APP时遇到了一个问题,卡了我好一会,最终找出来解决方法。

首先是报错:NullPointerException

这显然是空指针异常问题,什么是空指针异常呢

当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
  • 调用 null 对象的实例方法。
  • 访问或修改 null 对象的字段。
  • 将 null 作为一个数组,获得其长度。
  • 将 null 作为一个数组,访问或修改其时间片。
  • 将 null 作为 Throwable 值抛出。

我一开始百思不得其解,一开始以为是由于我对Recyclerview不熟悉,导致哪里出现了问题,

后来逐一排查,发现似乎是数据库的问题,这个问题是连接数据库后出现的。

但是最终还是发现数据库并没有地方写错。这又是为什么呢?

空指针异常无非是调用了null,数据库没有写错,但是却有可能调用数据库中空的内容,确定这个可能性最大。

最终我发现,确实是这样。

首先看一下我数据库函数怎么写的

public Clock getClockByKeyWord(int key){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String selectQuery = "SELECT * FROM " + Clock.TABLE + " WHERE " + Clock.KEYWORD +"=?";
        Clock clock = new Clock();
        Cursor cursor = db.rawQuery(selectQuery,new String[]{String.valueOf(key)});
        if (cursor.moveToFirst()){

                clock.date = cursor.getString(cursor.getColumnIndex(Clock.DATE));
                clock.word = cursor.getString(cursor.getColumnIndex(Clock.WORD));
                clock.summary = cursor.getString(cursor.getColumnIndex(Clock.SUMMARY));
                clock.maxday = cursor.getString(cursor.getColumnIndex(Clock.MAXDAY));
                clock.keep = cursor.getString(cursor.getColumnIndex(Clock.KEEP));
                return clock;
        }
        cursor.close();
        return null;
    }

这里,我通过自增的键值获取数据,如果获取不到,返回null,获取到则返回数据库的数据

然后看我调用数据库,我一开始是这样写的

private void initData() {
        mData = new ArrayList<>();
        CRUD crud = new CRUD(this);
        //导入数据

        for (int i = 0; i < crud.getCountClock(); i++) {

            Clock data = new Clock();
            Clock Data=crud.getClockByKeyWord(i);
            data.date= "日期:"+Data.date;
            data.word= "关键字:"+Data.word;
            data.summary= "总结:"+Data.summary;
            data.keep= "坚持天数:"+Data.keep;
            mData.add(data);
        }
        //设置布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        mList.setLayoutManager(linearLayoutManager);
        //创建适配器
        ListViewAdapter adapter = new ListViewAdapter(mData);
        //设置到rview里
        mList.setAdapter(adapter);
    }

可以看到用了一个for循环,i从零开始增加。

问题就出在了这里,我的数据库中的自增键值是从1开始的,这里从i=0开始,最终导致返回了null!!最终程序崩溃,报空指针异常

这个小细节让我付出了很多时间找这个bug,当然,也让我吃了个教训,毕竟吃一堑长一智

 

posted @ 2023-03-08 23:36  冰稀饭Aurora  阅读(57)  评论(0编辑  收藏  举报