为什么Arrays.asList(null)会抛出一个NullPointerException,而Arrays.asList(someNullVariable)不会?

2022-09-02 04:36:56

这个小程序

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

抛出一个 .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)

但是,此程序

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

private static Object returnNull(){
    return null;
}

不。为什么他们的行为不同?


答案 1

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

的签名是asList

public static <T> List<T> asList(T... a)

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

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


答案 2

asList() 的签名是 :-public static <T> List<T> asList(T... a)

所以 args 需要 T 类型的数组。

第一种情况:当您在asList中输入arg时,数组将指向null,因此抛出Exeption。
第二种情况:当您返回对任何指向 .然后它意味着数组具有单个对象,并且该对象指向因此不引发异常。nullnullnull