Как проверить нулевой элемент, если это целочисленный массив в Java?
Я совершенно новичок в Java и имею проблему с проверкой нулевого элемента в целочисленном массиве. Я использую 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!');
}
}
}
5 ответов
на Java, an 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!');
}
}
}
о примитивных vs ссылочных типах
An int
является примитивным типом, который отличается от ссылочного типа. Только ссылочные типы могут иметь значение null
.
ссылки
вопросы
On Integer
vs int
java.lang.Integer
фактически является ссылочным типом, обозначенным типом " box " для примитивного типа int
. Таким образом,Integer
переменная может иметь значение null
.
С введением autoboxing в Java, преобразования из int
to Integer
и наоборот можно сделать неявно. Но имейте имейте в виду, что они очень разные типы, и на самом деле попытка распаковки null
бросит NullPointerException
.
ссылки
вопросы
- в чем разница между int и integer в Java и в C#?
- почему автобоксинг в Java позволяет меня есть 3 возможных значений типа boolean?
о последствиях Integer
быть ссылка типа
одно следствие уже упомянуто: an Integer
переменная может иметь null
значение. Другой - это то, что ==
оператор на два Integer
является эталонным сравнением идентичности, а не числовым равенством.
System.out.println(new Integer(0) == new Integer(0)); // prints "false"
по возможности, вы должны предпочесть примитивные типы коробочным типам. Вот цитата из эффективное Java 2nd Edition, пункт 49: предпочитайте примитивные типы коробочным примитивам (курсив автора):
в общем, используйте примитивы в предпочтении к коробочному примитиву всякий раз, когда у вас есть выбор. Примитивные типы проще и быстрее. Если вы должны использовать коробочные примитивы, будьте осторожны! Autoboxing уменьшает многословие, но не опасность, использования коробочных примитивов. Когда ваша программа сравнивает два коробочных примитива с
==
оператор, он делает сравнение идентичности, которое почти наверняка не то, что вы хотите. Когда ваша программа выполняет вычисления смешанного типа с использованием коробочных и распакованных примитивов, она распаковывает и когда ваша программа делает распаковку, она может броситьNullPointerException
. Наконец, когда ваша программа помещает примитивные значения, это может привести к дорогостоящим и ненужным созданиям объектов.
вопросы
-
это гарантировано, что новое целое число (i) == i в Java?
- идет подробно о том, как
==
работаетInteger
иint
операнды
- идет подробно о том, как
, когда Integer
необходимо использовать
есть одно вопиющее исключение, где Integer
необходимо использовать над int
: дженерики. Параметры типа в Java generics должны быть ссылочными типами. Так что вы не можете иметь List<int>
в Java, вы должны использовать List<Integer>
вместо.
вопросы
см. также
при использовании соответствующей структуры данных
если вы должны есть int[]
, что разрешение null
значения, затем быстрый ответ-использовать Integer[]
. Поскольку теперь у вас есть массив ссылочные типы, некоторые элементы могут быть null
. Имейте в виду все последствия работы со ссылочными типами, или вы можете столкнуться с сюрпризами.
на данный момент, однако, я бы серьезно рассмотрел использование (см. эффективное Java 2nd Edition: предпочитайте списки массивам). Списки гораздо более многофункциональны, чем массивы, и хорошо взаимодействуют с большей платформой коллекций Java.
API-интерфейс ссылки
An ' int ' не может быть null. Целое число (которое является объектом) может. Итак, как сказал @Justin, Integer[] позволит вам проверить на null, но если int[] работает для вас, вам не нужно беспокоиться о тестировании на null, потому что это не может произойти.
вы можете использовать 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 != ''){
System.out.println(n);
}else
System.out.println("Null");
}
}
}