2013-01-16 2 views
0

은이 코드를 사용하여 데이터베이스에서 데이터를 가져 오는 오전 :Null 포인터 예외가 발생하는 이유는 무엇입니까?

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++; 
}  

이 내 테이블 모습입니다 : enter image description here

그러나 매번 마지막 행이 인출되지 않는 그리고 난 널 포인터 예외를 얻을. 여기에 로그 고양이 화면입니다 : enter image description here

왜 제대로 만 N-1 행을 실행하고, n은 내 뉴스 테이블의 행의 총 수입니다 행, n 번째에 문제를주는 내 코드입니다.

+0

필요하지 않거나 코드가 Null 값을 처리 할 수 ​​없습니다. –

답변

4

cursor.isLast()는 커서가 마지막 행에있을 때 true를 반환하므로 while 루프는 해당 행을 중지하고 &이 마지막 행을 처리하지 않습니다. 일반적으로 될 커서를 반복의 패턴은하지 isLast()의 동안

Cursor cursor = getACursor(); 
int i = 0; 
while (cursor.moveToNext()) { 
    /// do something with this row 
    allNews[i] = new News(cursor.getInt(0), cursor.getString(2),cursor.getString(1)); 
    i++; 
} 
+1

동의합니다. NPE는 추후에 쓰여지는데 아마도 저자가'allNews'를 통해 반복하려하지만 마지막 항목은 여전히 ​​null입니다. – Sam

+0

예이 코드는 작동하지만 여전히 내 코드의 결함을 이해하지 못했습니다. 왜냐하면 내가 사용하는 코드가 내 앱에서 완벽하게 작동하기 때문입니다. 그럼 왜 여기 있지? –

+1

같은 while (! last) 구문을 사용하면 다른 곳에서도 그 오류가 발생합니다. 그럴 경우 해당 case가 나중 NPE에 충돌하지 않을 것이므로주의하지 않았습니다. – superfell

1
while (!(cursor.isLast())) 

내가 문제를 생각 (중 moveToFirst()를 호출하지 않습니다이 유의). 마지막 행이 아니라고 명시 적으로 말하고 있습니다.

변경 while 루프에 : 당신은`커서 = null`하고 cursor.getCount (`에 null이 될 수없는 것처럼 다음 세 줄 나중에 사용) '중 하나 널 체크를 확인

while (cursor.moveToNext()) { 
    //Your code. 
} 
관련 문제