2013-10-02 14 views
7

Sembra non capirlo.Perché il mio metodo non vede null Oggetto

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

Con mia grande sorpresa, I am not null viene stampato sulla console. Perché non si visualizza il parametro passato obj come null.

+6

'objArray' non è nullo perché è un array con un singolo elemento : 'null'. –

+0

Poiché Object obj è il primo elemento dell'array. Prova a stampare il primo elemento di objArr. – porfiriopartida

+1

Controlla objArr [0] == null – JNL

risposta

13

La firma del metodo Object... objArr introduce una variabile "varargs". Ogni argomento passato in una chiamata a tale metodo viene assegnato il proprio slot in una matrice di quel nome.

Pertanto, quando si passa uno null, si ottiene un array objArr di lunghezza 1, il cui unico elemento è null. L'array non è null, l'elemento è.

Il JLS, Section 8.4.1 chiama questi "parametri arietà variabili":

L'ultimo parametro formale di un metodo o costruttore è speciale: può essere un parametro arity variabile, indicata da puntini seguendo tipo.

e

Invocazioni di un metodo arietà variabili possono contenere più attuali espressioni argomento di parametri formali. Tutte le effettive argomento espressioni che non corrispondono ai parametri formali precedenti parametro arit'a variabile saranno valutate e risultati memorizzati in un array che verrà inviato al metodo invocazione (§15.12.4.2).

(sottolineatura mia)

6

Un metodo con un elenco di parametri come Object... objArr utilizza un parametro di matrice. Quando lo chiami da main, il parametro è un array con un elemento. L'unico elemento, objArr[0], sarà null. Ma la matrice stessa non è nulla.

Infatti, anche se si chiama il metodo senza argomenti, ovvero myMethod(), l'array non è ancora nullo. Sarà una serie di lunghezza 0.

0

La matrice objArr non ci sarà nulla, di essere si sta passando da un argomento objmain quando si chiama questa funzione. obj è nullo, ma la matrice contiene questo elemento nullo, il che significa che la matrice ha una dimensione di 1 e non è nulla.

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

USCITA ->

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

objArr si comporta come args in main (String [] args) e se prova di u objArr [1] si getterà un eccezione che significa objArr è quasi un array

Problemi correlati