2013-10-02 4 views
7

Кажется, я не понимаю этого.Почему мой метод не видит нуль Объект

public class NewClass { 
    public static void main(String[] args) { 
     Object obj = null; 
     myMethod(obj); 
    } 

    public static void myMethod(Object... objArr) { 
     if(objArr != null) { 
      System.out.println("I am not null"); 
     } 
    } 
} 

К моему удивлению, I am not null печатается на консоли. Почему myMethod не видит переданного параметра obj как null.

+6

'objArray' не является нулевым, поскольку это массив с одним элементом : 'null'. –

+0

Поскольку Object obj - это первый элемент вашего массива. Попробуйте напечатать первый элемент objArr. – porfiriopartida

+1

Проверить для objArr [0] == null – JNL

ответ

13

Подпись метода Object... objArr вводит переменную «varargs». Каждому аргументу, переданному при вызове такого метода, присваивается свой собственный слот в массиве этого имени.

Поэтому, пройдя один null, вы получите массив objArr длины 1, единственным элементом которого является null. Сам массив не равен NULL, элемент есть.

JLS, Section 8.4.1 называет эти «переменные параметры арностью»:

Последний формальный параметр метода или конструктора является особенным: он может быть переменным параметром арностью, обозначается многоточием следующей от типа.

и

Вызовы метода переменной валентности может содержать больше фактических выражения аргументов, чем формальные параметры. Весь фактический аргумент выражение, которые не соответствуют формальным параметрам предыдущих переменного параметр Arity будет оцениваться и результатов сохраняются в массив, который будет передан в вызов методы (§15.12.4.2).

(курсив мой)

6

Метод с таким списком параметров, как Object... objArr, принимает параметр массива. Когда вы вызываете его из main, параметр представляет собой массив с одним элементом. Один элемент, objArr[0], будет null. Но сам массив не равен нулю.

Фактически, даже если вы вызываете метод без аргументов, то есть myMethod(), массив все еще не является нулевым. Это будет массив длины 0.

0

Массив objArr не будет нулевым, то вы передаете один аргумент obj из main при вызове этой функции. obj имеет значение null, но массив содержит этот нулевой элемент, что означает, что массив имеет размер 1 и не равен нулю.

0
if(objArr != null) 
     { 
      System.out.println("I am not null because I am an ARRAY object"); 
      System.out.println("I have " + objArr.length + " element(s)"); 
     } 

     if(objArr[0] == null) 
     { 
      System.out.println("NULL"); 
     } 

ВЫВОД ->

I am not null because I am an ARRAY object 
    I have 1 element(s) 
    NULL 

objArr ведет себя как арг в основных (String [] арг) и если и попытаться objArr [1] он будет бросаться значение исключения objArr - это почти массив

Смежные вопросы