Присвоение нулевого значения int

Если возможен следующий код:

Integer a = null;
int b = a;

Означает ли это, что функция, возвращающая возможное значение null для целого числа, является плохой практикой?

Изменить 1: В ответах есть несколько разных мнений. Я недостаточно уверен в том, чтобы выбирать тот или иной.

Ответы

Ответ 1

Этот код даст NullPointerException при запуске. Это в основном эквивалентно:

Integer a = null;
int b = a.intValue();

..., что делает его более ясным, что он действительно потерпит неудачу.

На самом деле вы не присваиваете нулевое значение int - вы пытаетесь и не выполняете.

Хорошо использовать null как значение для Integer; на самом деле часто Integer используется вместо int точно как "нулевой эквивалент".

Ответ 2

Это невозможно. Вы получите NullPointerException

Ответ 3

Это вызовет исключение NullPointerException.

Причиной этого является то, что вы полагаетесь на автоматическую распаковку значения Integer на примитивный тип int. Java делает это, внутренне вызывая .intValue() объекта, который является нулевым.

Что касается хорошей практики или нет... Я бы посоветовал не делать этого, если только код не используется вами, и вы очень хорошо себя ведете, убедившись, что вы только назначаете возвращаемое значение такого метода к значениям Integer, а не int.

Если ваш код заканчивается в lib, используемом другими, он небезопасен, и я предпочел бы явно выбросить исключение, хорошо документированное и разрешить защитное кодирование на стороне вызывающего.

Ответ 4

Конечно, вы не можете назначить значение null для int. Но возврат нулей в некоторых ситуациях имеет смысл. Null может означать, что значение не задано. Типичным примером является столбец БД.

Ответ 5

Код возможен, но выбрасывает NullPointerException во время выполнения из-за распаковки. Что касается

Означает ли это, что функция, возвращающая возможное нулевое значение для целое является плохой практикой?

да, это так. Это бесполезно и опасно (как вы можете видеть), чтобы вернуть Integer, когда a int достаточно, потому что объекты могут быть пустыми, а примитивы не могут. Integer следует использовать только при необходимости, например, в параметризованном типе - List<Integer>

Ответ 6

Забавная вещь с Java-генератором?: (используя 8u151 на OSX)

Если вы делаете

Integer x = map == null ? 0 : map.get ( key );

который кажется прекрасным и компактным, и все, тогда вы получите npe!!! если

map.get ( key )

- это нуль. Поэтому мне пришлось разбить это, и он работал нормально.

Ответ 7

Это действительно сработает.

Integer a = null;
Integer b = a;

Но я предпочел бы использовать значение int вне диапазона (-1, если ваши числа положительны) для возврата в случае ошибки.

Ответ 8

Это бокс для Java-бокса.

Integer a = null;
int b = a;

этот код назначает a на b, на самом деле компилятор сделает это: int b = a.intValue(), поэтому эта строка будет вызывать исключение NullPointerException;

код:

Integer a = 1;

на самом деле сделает это: Integer a = Integer.valueOf(1);

Вы можете использовать javap, чтобы просмотреть скомпилированные инструкции виртуальной машины.

Ответ 9

Вы можете написать простой тест:

public class Test {
    public static void main(String[] args){
        Integer a = null;
        int b = a;

        System.out.println(b);
    }
}

И выход представляет собой исключение NullPointerException в int b = a;

Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

Ответ 10

Начиная с Java 8, мы можем использовать Optional:

// example: if an Integer object is null, an int value could receive 0, for example:

Integer value = getSomeInteger (...); // (0, null, or some other numeric value)
int inteiro = Optional.ofNullable(value).orElse(0);