Может ли int
быть null
на Яве?
Например:
int data = check(Node root);
if ( data == null ) {
// do something
} else {
// do something
}
Моя цель - написать функцию, которая возвращает int
. Сказанное int
сохраняется в высоте узла, и если узел не присутствует, он будет нулевым, и мне нужно это проверить.
Я делаю это для домашней работы, но эта конкретная часть не является частью домашней работы, она просто помогает мне понять, что я делаю.
Спасибо за комментарии, но, похоже, мало кто на самом деле читал, что написано в коде, я спрашивал, как еще я могу достичь этой цели; было легко понять, что это не работает.
Ответы:
int
не может быть пустым, ноInteger
баночка . Вы должны быть осторожны при распаковке нулевых целых чисел, так как это может вызвать путаницу и почесать голову!например это:
даст вам
NullPointerException
, несмотря на объект не является нулевым!Чтобы ответить на ваш вопрос, если вы хотите указать отсутствие значения, я бы расследовал
java.util.Optional<Integer>
источник
int data = (Integer)check(node);
int i = (Integer)null;
будет выбрасывать NPE во время выполнения при распаковке.Нет. Только ссылки на объекты могут быть нулевыми, но не примитивами.
источник
Отличный способ узнать:
Попробуй скомпилировать.
источник
Integer ii = null; int i = ii;
скомпилирует, но сгенерируетВ Java int является примитивным типом и не считается объектом. Только объекты могут иметь нулевое значение. Таким образом, ответ на ваш вопрос - нет, он не может быть нулевым. Но это не так просто, потому что есть объекты, которые представляют большинство примитивных типов.
Класс Integer представляет значение типа int, но может содержать нулевое значение. В зависимости от вашего
check
метода вы можете возвращать int или Integer.Это поведение отличается от некоторых более чисто объектно-ориентированных языков, таких как Ruby, где даже такие «примитивные» вещи, как int, считаются объектами.
источник
Наряду со всем вышеприведенным ответом я бы тоже хотел добавить этот момент.
Для примитивных типов у нас фиксированный объем памяти, т.е. для int у нас есть 4 байта, а для char у нас есть 2 байта. И ноль используется только для объектов, потому что там размер памяти не фиксирован.
Таким образом, по умолчанию мы имеем,
и нет
То же самое с другими примитивными типами и, следовательно, null используется только для объектов, а не для примитивных типов.
источник
Код даже не скомпилируется. Только достойный
Object
может бытьnull
, какInteger
. Вот базовый пример, чтобы показать, когда вы можете проверить на null:С другой стороны, если
check()
объявлено возвращениеint
, оно никогда не может быть,null
и тогда весьif-else
блок становится излишним.Проблемы с автобоксом здесь также не применяются, когда
check()
объявляется возвращениеint
. Если он вернулсяInteger
, то вы можете рискнуть,NullPointerException
назначив егоint
вместоInteger
. Назначение его какInteger
и использованиеif-else
блока тогда было бы действительно обязательным.Чтобы узнать больше о Autoboxing, проверить это руководство Sun .
источник
int
, она никогда не может быть нулевой, и весь блок if будет тогда лишним.вместо того, чтобы объявить, как
int i
объявить это, какInteger i
тогда мы можем сделатьi=null;
источник
Целочисленный объект был бы лучшим. Если вы должны использовать примитивы, вы можете использовать значение, которое не существует в вашем случае использования. Отрицательный рост не существует для людей, поэтому
источник
Нет, но int [] может быть.
источник
Как отметил @Glen в комментарии, у вас есть два пути решения этой проблемы:
источник
Проверьте на null в вашем методе check () и верните недопустимое значение, такое как -1 или ноль, если null. Тогда проверка будет для этого значения, а не для передачи нулевого значения. Это было бы нормальным делом в старое время «С».
источник
Любой тип данных Primitive, например int, boolean, или float и т. Д., Не может хранить нулевой (боковой) тип, поскольку java предоставляет класс Wrapper для хранения того же типа, что и int, в Integer, от логического значения в Boolean.
Например: целое число i = ноль;
источник
Int не нуль, он может быть 0, если не инициализирован. Если вы хотите, чтобы целое число могло быть нулевым, вам нужно использовать Integer вместо int. примитивы не имеют нулевого значения. по умолчанию для int это 0.
Тип данных / Значение по умолчанию (для полей)
int ------------------ 0
длинный ---------------- 0L
float ---------------- 0.0f
двойной ------------- 0.0d
char --------------- '\ u0000'
Строка --------------- ноль
логическое ------------ ложь
источник
Поскольку вы просите другой способ достичь своей цели, я предлагаю вам использовать класс-оболочку:
источник
Я не эксперт, но я верю, что
null
эквивалент для int есть0
.Например, если вы делаете
int[]
, каждый слот содержит0
в противоположностьnull
, если вы не установите его на что-то другое.В некоторых ситуациях это может быть полезно.
источник