Вызов метода может вызвать java NullpointerException
У меня есть код:
public String getNameUpdateEvent(long id) {
Cursor mCursor =
db.rawQuery("select name from events WHERE _id=" + id + ";", null);
if (mCursor != null) {
mCursor.moveToFirst();
}
String updateNameEvent;
updateNameEvent = mCursor.getString(mCursor.getColumnIndex("name"));
return updateNameEvent;
}
и я получаю предупреждение
Warning:(173, 45) Method invocation 'mCursor.getColumnIndex("name")' may produce 'java.lang.NullPointerException'
Как я могу исправить это PLS?
Ответы
Ответ 1
Ваш курсор не может быть null
, он всегда будет иметь значение. Но курсор может быть пустым, поэтому сначала вы должны перейти к первой строке в курсоре с помощью метода moveToFirst()
, а если он возвращает true
- это означает, что курсор имеет хотя бы одну строку, поэтому вы можете сделать с ней все, что хотите, если он возвращает false
- это означает, что для вашего запроса ничего не существует, поэтому у вас нет строк для получения данных. Ваш код должен выглядеть так:
public String getNameUpdateEvent(long id) {
Cursor mCursor =
db.rawQuery("select name from events WHERE _id=" + id + ";", null);
String updateNameEvent = null;
if (mCursor != null && mCursor.moveToFirst()) {
updateNameEvent = mCursor.getString(mCursor.getColumnIndex("name"));
}
return updateNameEvent;
}
Ответ 2
Решение 1. Поскольку вы жестко кодируете SQL, почему бы не жестко кодировать индекс
updateNameEvent = mCursor.getString(0);
Решение 2:
try{
updateNameEvent = mCursor.getString(mCursor.getColumnIndexOrThrow("name"));
}catch(IllegalArgumentException ie){
updateNameEvent = 0;
}
Метод getColumnIndexOrThrow будет вызывать IllegalArgumentException, если столбец не существует.
Решение 1 выполняется быстрее и проще.