Method invocation may produce java NullpointerException
Asked Answered
P

2

15

I have a code:

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

and I´m getting a warning

    Warning:(173, 45) Method invocation 'mCursor.getColumnIndex("name")' may produce 'java.lang.NullPointerException'

How i can fix it pls?

Posology answered 23/12, 2014 at 23:6 Comment(3)
why not just mCursor.getString(1);Territerrible
Here's a thought, what would happen if mCursor is null and you make the call mCursor.getColumnIndex("name")?Sazerac
I have provided an anwer about this here: #46519888Proteose
R
23

Your cursor can not be null, it will always have any value. But cursor can be empty, so you should firstly go to first row in cursor with method moveToFirst(), and if it returns true - it means, that cursor has at least one row, so you can do with it all you want, if it returns false - it means, that there is nothing for your query, so you have not any rows to get data from. Your code should look like this:

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;
}  
Rafiq answered 23/12, 2014 at 23:16 Comment(3)
Won't this still produce the same warning: Warning:(173, 45) Method invocation 'mCursor.getColumnIndex("name")' may produce 'java.lang.NullPointerException'Battologize
I have edited my answer. I'm not sure if rawQuery can return null value. I thought that can't, so warning is IDE bug. But if can - then my. In any case it should have checking if cursor have values I think.Rafiq
ok, now the Orest edited solution is working, just i needeed to initialize String updateNameEvent = null; . Thanks!Posology
T
0

Solution 1: Since you are hard coding SQL, why not hard code the index

 updateNameEvent = mCursor.getString(0);

Solution 2:

try{
    updateNameEvent = mCursor.getString(mCursor.getColumnIndexOrThrow("name"));
}catch(IllegalArgumentException ie){
    updateNameEvent = 0; 
}

getColumnIndexOrThrow method will throw IllegalArgumentException if column don't exists.

Solution 1 is faster and simple.

Territerrible answered 23/12, 2014 at 23:16 Comment(2)
why change it around when he could just catch a NullPointerException?Battologize
with NullPointer, you still need to check for return -1Territerrible

© 2022 - 2024 — McMap. All rights reserved.