Может ли int быть null в Java?
может int быть null в Java?
например:
int data = check(Node root);
if ( data == null ) {
// do something
} else {
// do something
}
моя цель-написать функцию, которая возвращает int. Сказал int хранится в высоте узла, и если узел отсутствует, он будет равен нулю, и мне нужно будет проверить это.
я делаю это для домашнего задания, но эта конкретная часть не является частью домашнего задания, это просто помогает мне пройти через то, что я делаю.
Спасибо за комментарии, но мне кажется очень мало люди действительно читали, что находится под кодом, я спрашивал, как еще я могу достичь этой цели; было легко понять, что это не работает.
13 ответов:
intне могу быть null, ноIntegerможете. Вы должны быть осторожны при распаковке нуль целых, так как это может вызвать много путаницы и головной боли!например это:
int a = object.getA(); // getA returns a null Integerдаст вам
NullPointerException, несмотря на то, что объект не является нулевым!чтобы следить за вашим вопросом, если вы хотите указать отсутствие значения, я бы исследовал
java.util.Optional<Integer>
отличный способ узнать:
public static void main(String args[]) { int i = null; }попробуйте скомпилировать.
в Java int является примитивным типом и не считается объектом. Только объекты могут иметь нулевое значение. Поэтому ответ на ваш вопрос-нет, он не может быть нулевым. Но это не так просто, потому что есть объекты, которые представляют самые примитивные типы.
класс Integer представляет значение int, но он может содержать значение null. В зависимости от вашего
checkметод, вы можете возвращать int или целое число.Это поведение отличается от некоторых более чисто объектно-ориентированные языки, такие как Ruby, где даже "примитивные" вещи, такие как ints, считаются объектами.
наряду со всем вышеизложенным ответом я хотел бы добавить и этот момент.
для примитивных типов у нас есть фиксированный размер памяти, т. е. для int у нас есть 4 байта и char у нас есть 2 байта. И null используется только для объектов, потому что там размер памяти не фиксируется.
Так что по умолчанию у нас есть,
int a=0;, а не
int a=null;то же самое с другими примитивными типами и, следовательно, null используется только для объектов, а не для примитивных типов.
код даже не компилируется. Только полноправный
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блок тогда действительно был бы обязательным.чтобы узнать больше о автоупаковка, проверить это руководство Солнца.
целочисленный объект будет лучше всего. Если вы должны использовать примитивы можно использовать значение, которое не существует в вашем случае использовать. Отрицательная высота не существует для людей, поэтому
public int getHeight(String name){ if(map.containsKey(name)){ return map.get(name); }else{ return -1; } }
вместо объявления как
int iобъявим его какInteger iзатем мы можем сделатьi=null;Integer i; i=null;
Как @Glen упоминалось в комментарии, у вас в основном есть два способа обойти это:
- используйте значение "вне пределов". Например, если "данные" никогда не могут быть отрицательными при обычном использовании, верните отрицательное значение, чтобы указать, что оно недействительно.
- используйте целое число. Просто убедитесь, что метод" check " возвращает целое число, и вы назначаете его целому числу, а не int. Потому что если "int" участвует по пути, автоматический бокс и распаковка могут вызвать проблемы.
проверьте значение null в методе check () и верните недопустимое значение, такое как -1 или ноль, если null. Тогда проверка будет для этого значения, а не передавать null вдоль. Это было бы нормально делать в старые времена "C".
нет, но 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
поскольку вы просите другой способ достижения своей цели, я предлагаю вам использовать класс-оболочку:
new Integer(null);
Я не эксперт, но я верю, что
nullэквивалент для int-это0.например, если вы делаете
int[], каждый слот содержит0в противоположностьnull, Если вы установите его на что-то другое.в некоторых ситуациях это может быть полезным.
Comments