web-dev-qa-db-fra.com

Pourquoi Arrays.asList (null) lève une NullPointerException alors que Arrays.asList (someNullVariable) ne le fait pas?

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?

14
koushlendra

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.

8
ernest_k

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.

0
Tarun