2013-10-02 6 views
7

Wydaje mi się, że tego nie rozumiem.Dlaczego moja metoda nie widzi pustego obiektu Obiekt

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"); 
     } 
    } 
} 

Na moje zdziwienie, I am not null jest drukowany na konsoli. Dlaczego myMethod nie widzi przekazanego parametru obj jako wartości pustej.

+6

'objArray' nie jest pusty, ponieważ jest tablicą z pojedynczym elementem : 'null'. –

+0

Bo Object obj jest pierwszym elementem twojej tablicy. Spróbuj wydrukować pierwszy element objArr. – porfiriopartida

+1

Sprawdź objArr [0] == null – JNL

Odpowiedz

13

Sygnatura metody Object... objArr wprowadza zmienną "varargs". Każdy argument przekazany w wywołaniu takiej metody ma swój własny slot w tablicy o tej nazwie.

Dlatego, po przejściu jednego null, otrzymasz tablicę objArr o długości 1, której jedynym elementem jest null. Sama tablica nie ma wartości NULL, elementem jest.

JLS, Section 8.4.1 wzywa te „zmienne parametry arity”:

Ostatni parametr formalny metody lub konstruktora jest wyjątkowy: to może być zmienny parametr arity, oznaczone wielokropkiem następującym rodzaj.

i

Wezwania o zmiennym sposobie arity może zawierać więcej rzeczywistych przejawów argumentów niż parametrów formalnych. Wszystkie rzeczywiste argumentu określenia, które nie odpowiadają parametrów formalnych poprzednich zmiennego parametru Arity zostaną ocenione i wyniki przechowywane w tablicy które zostaną przekazane z metodą wywołania (§15.12.4.2).

(Kopalnia nacisk)

6

Metoda z listą parametrów, taką jak Object... objArr, przyjmuje parametr tablicy. Gdy wywołasz go z poziomu main, parametrem jest tablica z jednym elementem. Jeden element, objArr[0], będzie pusty. Ale sama tablica nie ma wartości NULL.

W rzeczywistości, nawet jeśli wywołasz metodę bez argumentów, tj. myMethod(), tablica nadal nie jest pusta. Będzie to tablica o długości 0.

0

Tablica objArr nie będzie pusty, będzie trzeba przejechać jeden argument obj z main podczas wywoływania tej funkcji. obj ma wartość null, ale tablica zawiera ten element zerowy, co oznacza, że ​​tablica ma rozmiar 1 i nie jest pusta.

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"); 
     } 

wyjściowy ->

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

objArr zachowuje się jak arg w głównym (string [] argumentach) jeśli u spróbować objArr [1], to wyrzucają wyjątek oznacza, że ​​obiekt objArr jest prawie tablicą:

Powiązane problemy