Ce petit programme
public class Client {
public static void main(String[] args) throws Exception {
Arrays.asList(null);
}
}
jette un 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)
Ce programme, cependant,
public static void main(String[] args) throws Exception {
Arrays.asList(returnNull());
}
private static Object returnNull(){
return null;
}
ne fait pas. Pourquoi se comportent-ils différemment?
La différence concerne simplement la façon dont l'argument est utilisé lors de l'exécution:
La signature de asList
est
public static <T> List<T> asList(T... a)
Arrays.asList(returnNull())
l'appelle avec un Object
. Ce clairement n'est pas interprété comme un tableau. Java crée un tableau lors de l'exécution et le transmet sous forme de tableau avec un élément null
. Cela équivaut à Arrays.asList((Object) null)
Cependant, lorsque vous utilisez Arrays.asList(null)
, l'argument transmis est considéré comme un tableau et, comme la méthode échoue explicitement sur les tableaux nuls passés en argument (voir Java.util.Arrays.ArrayList.ArrayList(E[])
), vous obtenir ce NPE.
La signature de asList () est: - public static <T> List<T> asList(T... a)
Donc, args nécessite un tableau de type T.
1er cas: lorsque vous mettez null
comme argument dans asList, le tableau pointera sur null, ce qui lancera Exeption.
2e cas: lorsque vous renvoyez une référence à un objet pointant vers null
. Ensuite, cela signifie tableau ayant un seul objet, et cet objet pointe vers null
donc ne lève pas Exception.