Java 为什么我得到空指针异常?

Java 为什么我得到空指针异常?,java,android,sqlite,cursor,nullpointerexception,Java,Android,Sqlite,Cursor,Nullpointerexception,我正在使用以下代码从数据库获取数据: Cursor cursor = db.query(News_Table, null, null, null, null, null, null); if (cursor != null) { cursor.moveToFirst(); } allNews = new News[cursor.getCount()]; int i = 0; while (!(cursor.isLast())) { allNews[i] = new New

我正在使用以下代码从数据库获取数据:

Cursor cursor = db.query(News_Table, null, null, null, null, null, null);

if (cursor != null) 
{
    cursor.moveToFirst();
}
allNews = new News[cursor.getCount()];
int i = 0;

while (!(cursor.isLast())) 
{
    allNews[i] = new News(cursor.getInt(0), cursor.getString(2),
            cursor.getString(1));
    cursor.moveToNext();
    i++;
}    
这是我的桌子的外观:

但每次我的最后一行没有被抓取,我就会得到一个空指针异常。以下是日志cat屏幕:

为什么我的代码只正确地运行了n-1行,并且在第(n)行出现了问题,其中n是新闻表中的总行数。

cursor.isLast()将在光标位于最后一行时返回true,因此while循环将在没有读取和处理最后一行时停止。通常,迭代游标的模式是(注意,这也不调用
moveToFirst()

当光标位于最后一行时,cursor.isLast()将返回true,因此while循环将在未读取并处理最后一行时停止。通常,迭代游标的模式是(注意,这也不调用
moveToFirst()

我认为这是一个问题,而不是
isLast()
。您明确表示如果不是最后一行

将while循环更改为:

 while (cursor.moveToNext()) {
   //Your code.
}
我认为这是一个问题,而不是
isLast()
。您明确表示如果不是最后一行

将while循环更改为:

 while (cursor.moveToNext()) {
   //Your code.
}

我同意。NPE稍后会抛出,可能是当作者试图循环查看
allNews
时,但最后一项仍然为空。是的,这段代码可以工作,但我仍然不理解代码中的缺陷,因为我在我的应用程序中使用的同一代码在其他地方可以完美工作。那么为什么不在这里呢?如果你有相同的while(!last)构造,那么它在其他地方也是错误的,也许这种情况没有影响到后来的NPE,所以你没有注意到。我同意。NPE稍后会抛出,可能是当作者试图循环查看
allNews
时,但最后一项仍然为空。是的,这段代码可以工作,但我仍然不理解代码中的缺陷,因为我在我的应用程序中使用的同一代码在其他地方可以完美工作。那么为什么不在这里呢?如果你有相同的while(!last)构造,那么它在其他地方也是错误的,也许这种情况没有影响到后面的NPE,所以你没有注意到。你检查
cursor!=null
然后三行之后使用它,就好像它不能与
游标一起为null一样。getCount()
不需要null检查,或者您的代码不能处理null值。您可以检查
游标!=空
然后三行之后使用它,就好像它不能与cursor.getCount()一起为空一样。要么不需要空检查,要么代码无法处理空值。
 while (cursor.moveToNext()) {
   //Your code.
}