Как проверить нулевой элемент, если это целочисленный массив в Java? - PullRequest
13 голосов
/ 13 июня 2010

Я довольно новичок в Java и у меня проблема с проверкой нулевого элемента в целочисленном массиве. Я использую Eclipse для редактора, и строка, которая проверяет нулевой элемент, показывает ошибку:

Строка, которая жалуется:

if(a[i] != null) {

Сообщение об ошибке из Eclipse:

The operator != is undefined for the argument type(s) int, null

В PHP это работает без проблем, но в Java кажется, что мне нужно изменить тип массива с целого на Object, чтобы строка не жаловалась (как показано ниже)

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!');
            }
        }
    }

Ответы [ 5 ]

22 голосов
/ 13 июня 2010

В 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!');
            }
        }
    }
7 голосов
/ 14 июня 2010

О примитивах и ссылочных типах

int - это примитивный тип, который отличается от ссылочного типа. Только ссылочные типы могут иметь значение null.

Ссылки

Похожие вопросы


Вкл. Integer против int

java.lang.Integer фактически является ссылочным типом, обозначенным типом «ящика» для примитивного типа int. Таким образом, переменная Integer может иметь значение null.

С введением autoboxing в Java, преобразования от int до Integer и наоборот могут выполняться неявно. Но имейте в виду, что они очень разных типов, и на самом деле попытка распаковать null приведет к NullPointerException.

Ссылки

Похожие вопросы


О последствиях Integer, являющихся ссылочным типом

Одно из последствий уже упоминалось: переменная Integer может иметь значение null. Еще один из них заключается в том, что оператор == для двух Integer является сравнением опорных идентификаторов, а не числовым равенством.

System.out.println(new Integer(0) == new Integer(0)); // prints "false"

По возможности, вы должны предпочитать примитивные типы коробочным типам. Вот цитата из Effective Java 2nd Edition, Item 49: Предпочитаю примитивные типы коробочным примитивам (выделено автором):

В итоге, используйте примитивы вместо коробочных примитивов, когда у вас есть выбор. Примитивные типы проще и быстрее. Если вы должны использовать коробочные примитивы, будьте осторожны! Автобокс уменьшает многословность, но не опасность использования штучных примитивов . Когда ваша программа сравнивает два коробочных примитива с оператором ==, она выполняет сравнение идентификаторов, что почти наверняка не , что вы хотите. Когда ваша программа выполняет вычисления смешанного типа с использованием упакованных и распакованных примитивов, она выполняет распаковку и , когда ваша программа выполняет распаковку, она может выдать NullPointerException. Наконец, когда ваша программа упаковывает примитивные значения, это может привести к дорогостоящим и ненужным созданиям объектов.

Похожие вопросы


Когда необходимо использовать Integer

Существует одно явное исключение, когда Integer должен использоваться вместо int: универсальные шаблоны. Параметры типа в обобщенных Java-кодах должны быть ссылочными типами. Таким образом, вы не можете иметь List<int> в Java; вместо этого вы должны использовать List<Integer>.

Похожие вопросы

Смотри также


Об использовании соответствующей структуры данных

Если вы должны иметь int[], который допускает значения null, тогда быстрый ответ - использовать Integer[]. Поскольку теперь у вас есть массив ссылочных типов, некоторые элементы могут быть null. Знайте обо всех последствиях работы со ссылочными типами, иначе вы можете столкнуться с неожиданностями.

Однако на этом этапе я бы серьезно подумал об использовании List<Integer> (см. Effective Java 2nd Edition: предпочитайте списки массивам ). Списки гораздо более функциональны, чем массивы, и они хорошо взаимодействуют с более крупной платформой Java Collections Framework.

API ссылки

3 голосов
/ 13 июня 2010

Int не может быть нулевым.Целое число (которое является объектом) может.Итак, как сказал @Justin, Integer [] позволит вам проверить на нулевое значение, но если int [] работает для вас, вам не нужно беспокоиться о проверке на нулевое значение, потому что это не может произойти.

1 голос
/ 13 июня 2010

int является примитивным типом в Java и не может быть нулевым.Только объекты могут быть нулевыми.

0 голосов
/ 03 марта 2016

Вы можете использовать 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");
    }
}
}
...