我在多个方面都很困惑。有人可以阐明这一点吗?这是示例代码。
public static void main(String[] args) {
String str = null;
abc(str);
}
static void abc(String... str){
System.out.println(str.length);
}
输出: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
。