为什么 Arrays.asList(null) 会抛出 NullPointerException 而 Arrays.asList(someNullVariable) 不会?
Why does Arrays.asList(null) throw a NullPointerException while Arrays.asList(someNullVariable) does not?
这个小程序
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;
}
没有。为什么他们的行为不同?
不同之处在于参数在运行时的使用方式:
asList
的签名是
public static <T> List<T> asList(T... a)
Arrays.asList(returnNull())
用 Object
调用它。 显然 不会被解释为数组。 Java 在运行时创建一个数组,并将其作为包含一个 null
元素的数组传递。这相当于 Arrays.asList((Object) null)
但是,当您使用 Arrays.asList(null)
时,传递的参数被视为一个数组,并且由于该方法在作为参数传递的空数组上显式失败(请参阅 java.util.Arrays.ArrayList.ArrayList(E[])
),你得到了那个 NPE。
asList() 的签名是:- public static <T> List<T> asList(T... a)
因此 args 需要类型为 T 的数组。
第一种情况:当您将 null
作为 arg 放入 asList 时,数组将指向 null,因此抛出 Exeption。
第二种情况:当您 return 引用任何指向 null
的对象时。那么这意味着数组只有一个对象,并且该对象指向 null
因此不会抛出异常。
这个小程序
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;
}
没有。为什么他们的行为不同?
不同之处在于参数在运行时的使用方式:
asList
的签名是
public static <T> List<T> asList(T... a)
Arrays.asList(returnNull())
用 Object
调用它。 显然 不会被解释为数组。 Java 在运行时创建一个数组,并将其作为包含一个 null
元素的数组传递。这相当于 Arrays.asList((Object) null)
但是,当您使用 Arrays.asList(null)
时,传递的参数被视为一个数组,并且由于该方法在作为参数传递的空数组上显式失败(请参阅 java.util.Arrays.ArrayList.ArrayList(E[])
),你得到了那个 NPE。
asList() 的签名是:- public static <T> List<T> asList(T... a)
因此 args 需要类型为 T 的数组。
第一种情况:当您将 null
作为 arg 放入 asList 时,数组将指向 null,因此抛出 Exeption。
第二种情况:当您 return 引用任何指向 null
的对象时。那么这意味着数组只有一个对象,并且该对象指向 null
因此不会抛出异常。