3

我对Java如何计算可变参数的长度感到很困惑:

static void hello(Integer... x){

    System.out.println(x.length);
}


public static void hi(){
    hello();
}

这会打印一个 0。

当我通过时:

static void hello(Integer... x){

    System.out.println(x.length);
}


public static void hi(){
    hello(null);
}

这会引发空指针异常。

static void hello(Integer... x){

    System.out.println(x.length);
}


public static void hi(){
    Integer[] xIntegers= new Integer[44];
    hello(xIntegers);
}

这将打印 44。

有人可以帮我理解吗?

4

4 回答 4

3

写这个:

static void hello(Integer... x){

基本上是一种奇特的写法:

static void hello(Integer[] x){

额外的好处是,您可以通过这种方式调用前者:

hello(Integer.valueOf(1), Integer.valueOf(2));

代替

hello(new Integer[]{Integer.valueOf(1), Integer.valueOf(2)});

话虽如此,您仍然可以使用带有可变参数的方法的第二种形式。

手头的第二个问题是数组,甚至是基元数组,在 Java 中被视为对象。所以如果你写:

hello(null);

您正在调用hello一个参数,该参数是 s 的null数组Integer,而不是 new Integer[]{null}s 。

第一次调用传递了一个空数组,因此长度为 0。类似地,第三次调用传递了一个长度为 44 的数组,您将得到它作为结果。

于 2018-05-01T06:37:50.570 回答
2

如果您将一个非null整数数组传递给您的hello()方法,那么正如您所见,您可以毫无问题地访问长度。因此,您应该检查null输入并将其等同于长度为零的数组:

static void hello(Integer... x) {
    int length = x == null ? 0 : x.length;
    System.out.println(length);

    if (x == null) return;

    // otherwise do something
}

public static void hi() {
    hello(null);
}

请注意,值只是作为数组传递,并且对于以下版本,您将遇到相同的问题hello()

static void hello(Integer[] x) { }

在这种情况下,如果您还尝试读取null输入的长度,则会出现异常。

于 2018-05-01T05:17:00.590 回答
0

如果原因是每个数组都有长度,如果它的内容有值,请记住数组的每个位置都是与其容器相同类型的变量,所以如果你发送 null 数组是空的,你需要用 if 来验证它为空打印空

static void hello(Integer... x){
  if(x!=null)
   System.out.println(x.length);
  else
    System.out.println('is null');
}
于 2018-05-01T05:23:12.490 回答
0

声明

static void hello(Integer... x)

您可以通过恰好传递一个Integer[](成为x方法内部)或传递零个或多个Integers 来调用它(编译器将创建一个Integer[]out 并成为x方法内部)。

如果是

hello(null)

无论您是尝试传递nulltype 的值Integer[],还是尝试传递 type 的单个nullInteger(两者都是合法的),都是模棱两可的。它默认为前者(null类型的值Integer[]),因此x在方法内部是null,而不是单个null元素的数组。尝试访问.lengthnull导致异常。

如果你想传递一个单一的null Integer,你可以通过明确地将其转换为来解决歧义Integer

hello((Integer)null);

或首先将其分配给类型的变量Integer

Integer x = null;
hello(x);

这些将打印长度为 1。

于 2018-05-01T16:48:14.317 回答