为什么Arrays.asList(null)抛出NullPointerException而Arrays.asList(someNullVariable)没有抛出异常?

kou*_*dra 14 java variadic-functions

这个小程序

public class Client {
    public static void main(String[] args) throws Exception {
        Arrays.asList(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

抛出一个NullPointerException

Exception in thread "main" java.lang.NullPointerException
    at java.base/java.util.Objects.requireNonNull(Objects.java:221)
    at java.base/java.util.Arrays$ArrayList.<init>(Arrays.java:4322)
    at java.base/java.util.Arrays.asList(Arrays.java:4309)
    at org.example.Client.main(Client.java:10)
Run Code Online (Sandbox Code Playgroud)

但是,该程序

public static void main(String[] args) throws Exception {
    Arrays.asList(returnNull());
}

private static Object returnNull(){
    return null;
}
Run Code Online (Sandbox Code Playgroud)

才不是。他们为什么表现不同?

ern*_*t_k 8

区别仅在于在运行时如何使用参数:

的签名asList

public static <T> List<T> asList(T... a)
Run Code Online (Sandbox Code Playgroud)

Arrays.asList(returnNull())用称呼它Object。这显然不会被解释为一个数组。Java在运行时创建一个数组,并将其作为带有一个null元素的数组传递。这相当于Arrays.asList((Object) null)

但是,当您使用时Arrays.asList(null),传递的参数将被视为一个数组,并且由于该方法在作为参数传递的空数组上显式失败(请参阅java.util.Arrays.ArrayList.ArrayList(E[])参考资料),因此您将获得该NPE。