为什么我的方法没有看到null Object

时间:2013-10-02 18:58:28

标签: java

我似乎不明白这一点。

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。

4 个答案:

答案 0 :(得分:13)

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

因此,当您传递一个null时,您将获得长度为1的数组objArr,其唯一元素为null。数组本身不为null,元素为。

JLS, Section 8.4.1调用这些“变量arity参数”:

  

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

  

变量arity方法的调用可能包含更多实际值   参数表达式比形式参数。所有的实际论点   表达式与前面的形式参数不对应   将评估变量arity参数并存储结果   到数组,将传递给方法调用   (§15.12.4.2)。

(强调我的)

答案 1 :(得分:6)

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

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

答案 2 :(得分:0)

数组objArr不会为null,如果您在调用此函数时从obj传递一个参数mainobj为null,但数组包含此null元素,这意味着数组的大小为1,并且不为null。

答案 3 :(得分: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 在main(String [] args )中的行为类似 args 如果你尝试objArr [1]它将抛出异常意味着objArr几乎是一个数组