为什么在期望数组返回该数组的大小为1时传递空字符串?

时间:2018-08-10 06:55:58

标签: java

我在多个方面都很困惑。有人可以阐明这一点吗?这是示例代码。

public static void main(String[] args) {
    String str = null;
    abc(str);
}
static void abc(String... str){
    System.out.println(str.length);
}
  

输出:1

1 个答案:

答案 0 :(得分:10)

让我们分解一下。我重命名了参数名称以使其更清晰。

static void abc(String... arrayOfStrings){
    System.out.println(arrayOfStrings.length);
}

String ...的意思是,您不必传递数组,而是可以依次传递每个项目作为参数,并在它们下面将它们组合成一个数组。您仍然可以传递类型为String[]的显式对象(在这种情况下,它将不会为您创建数组),但是仅传递null会假定它的类型为String而不是{{1 }}。

您正在做String[](因为您要传递的参数是abc(null))。

所以null将有一项,恰好是arrayOfStrings的引用。

因此,null返回arrayOfStrings.length

如果您进行了1,则将获得abc(null, null)

如果您执行了2,则将得到一个abc((String[]) null),因为您将尝试获取NullPointerException对象引用的length。如果希望传递空值,请确保null在访问作为参数传递的数组之前检查abc()

作为一般的最佳实践,请尽可能避免传递null,最好传递一个空数组。传递null只是一种毒药,等待某种方法忘记检查null并抛出null