Как проверить нулевой элемент, если он является целым массивом в Java?
Я новичок в Java и имею проблему проверки нулевого элемента в массиве integer.
Я использую Eclipse для редактора, а строка, проверяющая нулевой элемент, показывает ошибку:
Линия, которая жалуется:
if(a[i] != null) {
Ошибка msg из Eclipse:
The operator != is undefined for the argument type(s) int, null
В PHP это работает без каких-либо проблем, но в Java кажется, что мне нужно изменить тип массива от integer до Object, чтобы строка не была жаловаться (например, ниже)
Object[] a = new Object[3];
Итак, мой вопрос: если я все еще хочу объявить как целочисленный массив и все еще хочу проверить значение null,
для чего это синтаксис?
код:
public void test() {
int[] a = new int[3];
for(int i=0; i<a.length; i++) {
if(a[i] != null) { //this line complains...
System.out.println('null!');
}
}
}
Ответы
Ответ 1
В Java, int
является примитивным типом и не может быть null
. Однако объекты хранятся в виде ссылок, поэтому, если вы объявляете ссылку на объект, но не создаете объект new
, ссылка будет null
.
Integers
- обертки объектов вокруг ints
, что означает, что они могут быть null
.
public void test() {
Integer[] a = new Integer[3];
for(int i=0; i<a.length; i++) {
if(a[i] != null) { //should now compile
System.out.println('null!');
}
}
}
Ответ 2
В примитивных vs ссылочных типах
An int
- это примитивный тип, который отличается от ссылочного типа. Только ссылочные типы могут иметь значение null
.
Ссылки
Связанные вопросы
Вкл Integer
vs int
java.lang.Integer
- фактически ссылочный тип, обозначенный тип "box" для примитивного типа int
. Таким образом, переменная Integer
может иметь значение null
.
С введением автобоксинга в Java конверсии от int
до Integer
и наоборот могут выполняться неявно. Но имейте в виду, что они очень разные типы, и на самом деле попытка unbox null
будет бросать NullPointerException
.
Ссылки
Связанные вопросы
По последствиям Integer
является ссылочным типом
Уже упоминалось одно последствие: переменная Integer
может иметь значение null
. Другим является то, что оператор ==
на двух Integer
является сравнительным сопоставлением идентичности, а не численным равенством.
System.out.println(new Integer(0) == new Integer(0)); // prints "false"
По возможности, вы должны предпочесть примитивные типы для типов в штучной упаковке. Здесь цитата из Effective Java 2nd Edition, пункт 49: Предпочитают примитивные типы для вложенных в примитив примитивов (выделение автором):
В общем, используйте примитивы, предпочитая вложенные в бокс примитивы, когда у вас есть выбор. Примитивные типы проще и быстрее. Если вы должны использовать примитивы в штучной упаковке, будьте осторожны! Автобоксинг уменьшает многословие, но не опасность использования примитивов в штучной упаковке. Когда ваша программа сравнивает два бокс-примитива с оператором ==
, он сопоставляет личность, что почти наверняка не то, что вы хотите. Когда ваша программа выполняет смешанные вычисления с использованием примитивов с боксами и unboxed, она делает unboxing и , когда ваша программа распаковывается, она может бросать NullPointerException
. Наконец, когда ваши программные коды приносят примитивные значения, это может привести к дорогостоящим и ненужным созданиям объектов.
Связанные вопросы
Если Integer
необходимо использовать
Существует одно вопиющее исключение, где Integer
должно использоваться над int
: generics. Параметры типа в Java-дженериках должны быть ссылочными типами. Таким образом, вы не можете List<int>
в Java; вы должны использовать List<Integer>
.
Связанные вопросы
См. также
При использовании соответствующей структуры данных
Если у вас должен быть int[]
, который допускает значения null
, то быстрый ответ заключается в использовании Integer[]
. Поскольку теперь у вас есть массив ссылочных типов, некоторые элементы могут быть null
. Имейте в виду все последствия работы со ссылочными типами, или вы можете столкнуться с неожиданностями.
В этот момент, однако, я бы серьезно подумал об использовании List<Integer>
вместо этого (см. "Эффективное Java 2nd Edition: предпочтительные списки для массивов" ). Списки гораздо более функциональные, чем массивы, и хорошо взаимодействуют с более крупной платформой коллекций Java.
Ссылки API
Ответ 3
An 'int' не может быть нулевым. Целое число (которое является объектом) может. Итак, как сказал @Justin, Integer [] позволит вам протестировать значение null, но если для вас работает int [], вам не нужно беспокоиться о проверке нулевого значения, потому что этого не может быть.
Ответ 4
int является примитивным типом в java и не может быть нулевым. Только объекты могут быть пустыми.
Ответ 5
Вы можете использовать arr [i]!= '\ 0', как это. Это сработало для меня.
public class IntNullCheck {
public static void main(String[] args) {
int[] intarr = new int[5];
intarr[0] = 7;
intarr[3] = 9;
for(int n : intarr){
if(n != '\0'){
System.out.println(n);
}else
System.out.println("Null");
}
}
}