Может ли 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
, если вы не установите его на что-то еще.
В некоторых ситуациях это может быть полезно.