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

155

Может ли intбыть nullна Яве?

Например:

int data = check(Node root);

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

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

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

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

user220755
источник
1
Это ошибка времени компиляции.
MayurB

Ответы:

201

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

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

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

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

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

Брайан Агнью
источник
2
Существуют веские причины для существования класса Integer, поэтому используйте его, когда это необходимо.
Благословенный Компьютерщик
6
@ h2g2java: Надеюсь, вы не думаете, что возможность использовать их с коллекцией по умолчанию является привлекательной, потому что для таких вещей, как HashMap <Integer, Integer> уровень отходов огромен и не убедителен. Вот почему TIntIntHashMap от Trove, использующий только примитивы, обходит неимоверный HashMap <Integer, Integer>.
СинтаксисT3rr0r
1
int не может быть проверен на null, однако вы можете безопасно присвоить null для int в Java, приведя его к Integer, например, если метод check (root) может вернуть null, тогда вы можете безопасно привести его к int, выполнив что-то вроде это: int data = (Integer)check(node);
священное событие
@sactiw - Можете ли вы уточнить? Я не уверен, что понимаю, к чему ты клонишь
Брайан Агнью,
7
@BrianAgnew Позвольте мне исправить то, что я сказал здесь, я был совершенно неправ, я в основном не понимал, что int i = (Integer)null;будет выбрасывать NPE во время выполнения при распаковке.
священное событие
40

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

Игнасио Васкес-Абрамс
источник
3
Стоит упомянуть класс Integer, который был бы более подходящим, если ОП хочет нулевое значение. Или он может использовать отрицательное значение, чтобы указать «не найден»
Глен
31

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

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

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

Мэтт Луонго
источник
37
На самом деле ... ОП уже выяснил это сам по последней фразе в своем вопросе: было легко понять, что это не работает.
BalusC
9
Для потомков почти 4 года спустя - этот бит был в более поздней редакции.
Мэтт Луонго
3
но .. Integer ii = null; int i = ii;скомпилирует, но сгенерирует
исключение
13

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

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

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

Джонатон Фауст
источник
8

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

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

Таким образом, по умолчанию мы имеем,

   int a=0;

и нет

   int a=null;

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

Шоаиб Чикате
источник
5

Код даже не скомпилируется. Только достойный 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блока тогда было бы действительно обязательным.

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

BalusC
источник
1
К сожалению, если «check» возвращает int, а не Integer, это не поможет, потому что int (который не будет нулевым) будет автоматически помещен в Integer.
Пол Томблин
2
О, это был просто базовый пример, чтобы показать, когда можно проверить на ноль. С другой стороны, если проверка объявлена ​​как возвращающая int, она никогда не может быть нулевой, и весь блок if будет тогда лишним.
BalusC
3

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

Integer i;
i=null;
Minati
источник
2

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

public int getHeight(String name){
    if(map.containsKey(name)){
        return map.get(name);
    }else{
        return -1;
    }
}
Нино ван Хофф
источник
1

Нет, но 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
JMI MADISON
источник
0

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

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

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

user3550884
источник
0

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

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

Сачин Пит
источник
0

Int не нуль, он может быть 0, если не инициализирован. Если вы хотите, чтобы целое число могло быть нулевым, вам нужно использовать Integer вместо int. примитивы не имеют нулевого значения. по умолчанию для int это 0.

Тип данных / Значение по умолчанию (для полей)

int ------------------ 0

длинный ---------------- 0L

float ---------------- 0.0f

двойной ------------- 0.0d

char --------------- '\ u0000'

Строка --------------- ноль

логическое ------------ ложь

Мохаммад Фатхи
источник
-2

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

new Integer(null);
Сэнди
источник
-17

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

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

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

Лан
источник
Очень просто, 0 не то же самое, что ноль.
Дейв Гудчайлд