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