Подтвердить что ты не робот

Вызов метода может вызвать 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?

4b9b3361

Ответ 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 выполняется быстрее и проще.