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

NPE при попытке вернуть null

Эта программа должна избегать null при вызове toFloat с нулевым значением.  но я все еще получаю NPE.. любая помощь

System.out.println(toFloat(null, null));

private static Float toFloat(Float def, String str) {
    try {
        return str != null ? Float.parseFloat(str) : def;
    } catch (NumberFormatException e) {
        return def;
    }
}
4b9b3361

Ответ 1

Это очень тонко. Float.parseFloat возвращает float, а не float. Вторые два операнда условного оператора должны быть одного типа, но вы даете ему float (результат Float.parseFloat) и float (def). Компилятор выбирает float, потому что float можно принудительно выполнить с помощью float с помощью автоматической распаковки.

Итак, что выводит компилятор, как будто вы написали это:

private static Float toFloat(Float def, String str) {
    try {
        return str != null ? Float.parseFloat(str) : def.floatValue();
        // Note ----------------------------------------^^^^^^^^^^^^^
    } catch (NumberFormatException e) {
        return def;
    }
}

... и, конечно, вызов floatValue на null вызывает NPE.

Вы можете исправить это, убедившись, что тип второго операнда float, а не float. Много способов сделать это, но как указывает Zefick , самым простым является Float.valueOf(String):

private static Float toFloat(Float def, String str) {
    try {
        return str != null ? Float.valueOf(str) : def;
    } catch (NumberFormatException e) {
        return def;
    }
}