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



может int быть null в Java?



например:



int data = check(Node root);

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


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



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



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

1070   13  

13 ответов:

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

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

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

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

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

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

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

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

    Ничего не найдено.