Может ли int быть пустым в Java?

Может ли int быть null в Java?

Например:

int data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

Моя цель - написать функцию, которая возвращает int. Указанный int хранится в высоте node, а если node нет, он будет равен нулю, и мне нужно будет это проверить.

Я делаю это для домашней работы, но эта конкретная часть не является частью домашней работы, она просто помогает мне пройти через то, что я делаю.

Спасибо за комментарии, но, похоже, очень немногие люди действительно читают, что под кодом, я спрашивал, как еще я могу достичь этой цели; было легко понять, что он не работает.

Ответ 1

int не может быть нулевым, но Integer может. Вы должны быть осторожны при распаковке нулевых целых чисел, поскольку это может вызвать много путаницы и царапин на голове!

например. это:

int a = object.getA(); // getA returns a null Integer

предоставит вам NullPointerException, несмотря на то, что объект не является нулевым!

Чтобы следить за своим вопросом, если вы хотите указать отсутствие значения, я бы исследовал java.util.Optional<Integer>

Ответ 2

Нет. Только ссылки на объекты могут быть нулевыми, а не примитивными.

Ответ 3

Отличный способ узнать:

public static void main(String args[]) {
    int i = null;
}

Попробуйте выполнить компиляцию.

Ответ 4

В Java int является примитивным типом и не считается объектом. Только объекты могут иметь нулевое значение. Поэтому ответ на ваш вопрос - нет, он не может быть нулевым. Но это не так просто, потому что есть объекты, которые представляют собой самые примитивные типы.

Класс Integer представляет значение int, но может содержать нулевое значение. В зависимости от вашего метода check вы можете возвращать int или Integer.

Это поведение отличается от некоторых более чисто объектно-ориентированных языков, таких как Ruby, где даже "примитивные" вещи, такие как int, считаются объектами.

Ответ 5

Наряду со всем вышеприведенным ответом я тоже хотел бы добавить этот пункт.

Для примитивных типов мы имеем фиксированный размер памяти i.e для int у нас есть 4 байта, а char - 2 байта. И null используется только для объектов, потому что размер памяти не фиксирован.

Итак, по умолчанию мы имеем

   int a=0;

а не

   int a=null;

То же самое с другими примитивными типами, и поэтому null используется только для объектов, а не для примитивных типов.

Ответ 6

Код даже не компилируется. Только полнофункциональный Object может быть null, например Integer. Вот базовый пример, показывающий, когда вы можете проверить значение null:

Integer data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

С другой стороны, если check() объявлен как возвращаемый int, он может никогда быть null, а весь блок if-else лишний.

int data = check(Node root);

// do something

Проблемы с автобоксированием здесь также не применяются, когда объявляется check() return int. Если он возвратил Integer, тогда вы можете рискнуть NullPointerException при назначении ему int вместо Integer. Назначение его как Integer и использование блока if-else было бы действительно обязательным.

Чтобы узнать больше об автобоксинге, отметьте это руководство Sun.

Ответ 7

вместо того, чтобы объявить как int i объявить его как Integer i тогда мы можем сделать i=null;

Integer i;
i=null;

Ответ 8

Целый объект будет лучше. Если вы должны использовать примитивы, вы можете использовать значение, которое не существует в вашем случае использования. Отрицательная высота не существует для людей, поэтому

public int getHeight(String name){
    if(map.containsKey(name)){
        return map.get(name);
    }else{
        return -1;
    }
}

Ответ 9

Нет, но int [] может быть.

int[] hayhay = null; //: allowed (int[] is reference type)
int   hayno  = null; //: error   (int   is primitive type)
                     //: Message: incompatible types: 
                     //: <null> cannot be converted to int

Ответ 10

Как упоминается в комментарии @Glen, в основном у вас есть два способа обойти это:

  • используйте значение "вне привязки". Например, если "данные" никогда не могут быть отрицательными при нормальном использовании, верните отрицательное значение, чтобы указать его недействительным.
  • Используйте Integer. Просто убедитесь, что метод "check" возвращает Integer, и вы назначаете его Integer, а не int. Потому что, если на пути задействован "int", автоматический бокс и распаковка могут вызвать проблемы.

Ответ 11

Проверить значение null в методе check() и вернуть недопустимое значение, например -1 или ноль, если значение null. Тогда проверка будет для этого значения, а не для передачи нулевого значения. Это было бы нормальным делом в старом времени "C".

Ответ 12

Любой тип данных Primitive, такой как int, boolean, или float и т.д., Не может хранить нулевой (боковой) тип, поскольку java предоставляет класс Wrapper для хранения того же типа, что и int, в Integer, от boolean до Boolean.

Например: целое число я = ноль;

Ответ 13

Поскольку вы просите другой способ достичь своей цели, я предлагаю вам использовать класс-оболочку:

new Integer(null);

Ответ 14

Я не эксперт, но я считаю, что эквивалент null для int - 0.

Например, если вы создаете int[], каждый слот содержит 0 в отличие от null, если вы не установите его на что-то еще.

В некоторых ситуациях это может быть полезно.