Я довольно плохо знаком с Java и наличием проблемы, проверяющей пустой элемент в целочисленный массив. Я использую Eclipse для редактора и строки, которая проверяет, что пустой элемент показывает ошибку:
Строка, которая жалуется:
if(a[i] != null) {
Сообщение об ошибке от Eclipse:
The operator != is undefined for the argument type(s) int, null
В PHP это работает без любой проблемы, но в Java кажется, что я должен изменить тип массива от целого числа до Объекта заставить строку не жаловаться (как ниже)
Object[] a = new Object[3];
Таким образом, мой вопрос состоит в том, если я все еще хочу объявить, как целое число выстраивает и все еще хочет проверить пустой указатель, каков синтаксис для него?
Код:
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!');
}
}
}
В Java int
является примитивным типом и не может быть нулевым
. Однако объекты хранятся как ссылки, поэтому, если вы объявляете ссылку на объект, но не создаете новый
объект, ссылка будет нулевой
.
Целые числа
- это объектные оболочки вокруг целых чисел
, то есть они могут быть нулевыми
.
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!');
}
}
}
Число 'int' не может быть нулевым. Integer (который является объектом) может. Поэтому, как сказал @Justin, Integer[] позволит вам проверить на null, но если int[] работает для вас, то вам не нужно беспокоиться о проверке на null, потому что этого не может произойти.
int
- это примитивный тип, который отличается от ссылочного типа. Только ссылочные типы могут иметь значение null
.
Integer
vs int
java.lang.Integer
на самом деле является ссылочным типом, обозначенным типом «коробочка» для примитивного типа int
. Таким образом, переменная Integer
может иметь значение null
.
С введением автобокса в Java преобразование из int
в Integer
и наоборот может выполняться неявно.Но имейте в виду, что это очень разные типы, и на самом деле попытка распаковать null
вызовет NullPointerException
.
Integer
является ссылочным типом Одно последствие уже упоминалось: переменная Integer
может иметь пустое
значение. Другой заключается в том, что оператор ==
для двух Integer
является сравнением эталонных идентичностей, а не числовым равенством.
System.out.println(new Integer(0) == new Integer(0)); // prints "false"
По возможности вам следует предпочесть примитивные типы упакованным типам. Вот цитата из Effective Java 2nd Edition, пункт 49: Предпочитайте примитивные типы примитивам в штучной упаковке (выделено автором):
Таким образом, используйте примитивы вместо примитивов в штучной упаковке всякий раз, когда у вас есть выбор. Примитивные типы проще и быстрее. Если вы должны использовать примитивы в штучной упаковке, будьте осторожны! Автобокс снижает многословие, но не снижает опасность использования упакованных примитивов . Когда ваша программа сравнивает два упакованных примитива с оператором
==
, она выполняет сравнение идентичности, что почти наверняка не то, что вам нужно.Когда ваша программа выполняет вычисления смешанного типа с использованием упакованных и распакованных примитивов, она выполняет распаковку, и , когда ваша программа выполняет распаковку, она может выброситьNullPointerException
. Наконец, когда ваша программа упаковывает примитивные значения, это может привести к созданию дорогостоящих и ненужных объектов.
==
ведет себя для Integer
и int
операнды Integer
Есть одно явное исключение, когда Integer
должно использоваться вместо int
: generics . Параметры типа в универсальных шаблонах Java должны быть ссылочными типами. Таким образом, вы НЕ МОЖЕТЕ иметь List
в Java; вместо этого вы должны использовать List
.
Если вы должны иметь int []
, который разрешает нулевые
значения, тогда быстрый ответ - использовать Integer []
. Поскольку теперь у вас есть массив ссылочных типов, некоторые элементы могут иметь значение null
. Помните обо всех последствиях работы со ссылочными типами, иначе вы можете столкнуться с сюрпризами.
На этом этапе, однако, я бы серьезно подумал об использовании вместо него List
(см. Эффективное второе издание Java: предпочитать списки массивам ).Списки гораздо более многофункциональны, чем массивы, и хорошо взаимодействуют с более крупной платформой коллекций Java.
int - это примитивный тип в java, и он не может быть нулевым. Только объекты могут быть нулевыми.