2013-10-02 48 views
7

我似乎不理解这一点。为什么我的方法看不到null对象

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参数视为空。

+6

'objArray'不为null,因为它是一个包含单个元素的数组:'null'。 –

+0

因为Object obj是数组的第一个元素。尝试打印objArr的第一个元素。 – porfiriopartida

+1

检查objArr [0] == null – JNL

回答

13

方法签名Object... objArr引入了“varargs”变量。在调用这种方法时传递的每个参数都会在该名称的数组中给出自己的插槽。

因此,当您通过一个null时,将得到长度为1的数组objArr,其唯一元素为null。数组本身不是null,元素是。

JLS, Section 8.4.1调用这些“可变元数参数”:

方法或构造的最后形式参数是特殊的:它 可以是可变参数数量参数,由以下 类型省略号表示。

可变元数方法的

调用次数可以含有除形式参数多个实际 参数表达式。所有不对应于可变参数元数前述 形式参数的实际参数 表达式将被评估和结果存储 到一个数组将被传递到方法调用 (§15.12.4.2)。

(重点煤矿)

6

带有参数列表Object... objArr的方法需要一个数组参数。当您从main调用它时,参数是一个包含一个元素的数组。一个元素objArr[0]将为空。但是数组本身不是null。

事实上,即使您调用没有参数的方法,即myMethod(),该数组仍然不为空。它将是一个长度为0的数组。

0

数组objArr不会是空,是你从main调用这个函数时传递一个参数objobj为空,但数组包含此空元素,这表示数组的大小为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"); 
     } 

OUTPUT - >

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

objArr行为就像ARGS在主要(字符串[] ARGS) 和如果u尝试objArr [1]将引发异常含义objArr几乎是一个数组

相关问题