Может ли int быть нулевым в Java? - PullRequest
136 голосов
/ 12 февраля 2010

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

Например:

int data = check(Node root);

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

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

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

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

Ответы [ 13 ]

176 голосов
/ 12 февраля 2010

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

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

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

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

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

37 голосов
/ 12 февраля 2010

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

27 голосов
/ 12 февраля 2010

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

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

Попробуйте скомпилировать.

12 голосов
/ 12 февраля 2010

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

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

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

8 голосов
/ 22 октября 2013

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

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

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

   int a=0;

а не

   int a=null;

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

5 голосов
/ 12 февраля 2010

Код даже не скомпилируется. Только полноценный 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() возвращает int. Если он вернул Integer, то вы можете рискнуть NullPointerException при назначении его int вместо Integer. Назначение его как Integer и использование блока if-else тогда действительно были бы обязательными.

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

3 голосов
/ 18 августа 2018

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

Integer i;
i=null;
2 голосов
/ 01 марта 2013

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

public int getHeight(String name){
    if(map.containsKey(name)){
        return map.get(name);
    }else{
        return -1;
    }
}
1 голос
/ 13 августа 2018

Нет, но 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
0 голосов
/ 12 мая 2016

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

new Integer(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...