2015-12-10 4 views
1

Я пытаюсь проверить, имеет ли мой массив данный элемент. Для этого я конвертирую этот массив в список, а затем с помощью contains.But, я получаю это странное поведение.Java, Arrays to ArrayList

int[] arr=null; 
System.out.println(Arrays.asList (arr).contains(1)); //output as false 
System.out.println(Arrays.asList(null).contains(1)); //nullPointerException 

Почему первый не бросает NPE? Пожалуйста, предложите.

+4

Первый список с одним элементом, нулевое значение, тип '' список . Второй пытается создать список ('List ') из массива varargs, но массив равен null и вызывает NPE. – Andreas

+0

Возможный дубликат [Varargs с нулевыми параметрами в Java] (http://stackoverflow.com/questions/12870021/varargs-with-null-parameters-in-java) –

+0

ошибка заблокирована [здесь] (http: // bugs. java.com/bugdatabase/view_bug.do?bug_id=4189641) уже –

ответ

0

Примитивные представляет ценность и изменяемый объект представляют ссылку. null - это ключевое слово в java, и оно используется для обозначения отсутствия чего-либо или ссылки ничего. Если вы создаете объект как

Object obj=new Object(); or Integer i=new Integer(); 

Heap память присвоить некоторое пространство для справки переменного OBJ и я. , когда вы назначаете obj = null; или i = null; это означает, что obj и i не будут указывать на эту память или любую ее часть.

int[] arr=null; 

Здесь arr является примитивной переменной, и ее значение равно null.

При попытке преобразовать массив в список по Arrays.asList (arr) ваш проходящий пустой массив, но ваш переход.

Поскольку

public static <T> List<T> asList(T... a) { 
return new ArrayList<T>(a); 
} 

asList() метод отбора переменной длины массива и возвращать список.

Когда вы пишете

System.out.println(Arrays.asList (arr).contains(1)); //output as false 

означает, что ваш фактически по сравнению с 1 из возвращенного списка и содержит (1) метод проверки ли 1 присутствует или нет в списке.

Но во втором заявлении System.out.println(Arrays.asList (null).contains(1)); ваше пропускание null. метод asList (нуль) пытаются

return new ArrayList<T>(a); 

, что означает возвращение заявление, призывающее к

ArrayList(E[] array) { 
     if (array==null) 
      throw new NullPointerException(); 
    a = array; 
} 

и во втором заявлении вы передаете нуль.

В случае Integer[] arr = null; ваш фактически создает объект Integer класса-оболочки и переменной объекта представляют собой ссылки, здесь обр является объектом, и это имеет в виду null.And нуль означает ссылку на nothing.So, что причина, почему System.out.println(Arrays.asList (arr).contains(1)); бросить NPE

О нуль в Java вы можете по этой ссылке для получения более подробной информации: 9 Things about Null in Java

0

Java примитивные типы не работают с Arrays.asList(T...); это маскируется из-за массива (который является допустимым типом T, поэтому a List от int[]). Вам нужен соответствующий тип обертки. Нечто подобное,

Integer[] arr = { 1 }; 
System.out.println(Arrays.asList(arr).contains(1)); 

, который выводит (как и ожидалось)

true 
0

Реализация Arrays.asList() метод: Проверка Here

public static <T> List<T> asList(T... array) { 
    return new ArrayList<T>(array); 
} 

Вот почему, вы не можете заключить контракт, как new ArrayList<int>() с примитивным типом данных int ,

Если это так, если вы измените ваш источник int к Integer

Integer[] arr = null; 
System.out.println(Arrays.asList (arr).contains(1)); ///nullPointerException 
System.out.println(Arrays.asList(null).contains(1)); //nullPointerException