Question La vérification NULL est-elle nécessaire avant d'appeler instanceof?


Volonté null instanceof SomeClass revenir false ou jeter un NullPointerException?


1085
2018-06-01 13:53


origine


Réponses:


Non, une vérification null n'est pas nécessaire avant d'utiliser instanceof.

L'expression x instanceof SomeClass est false si x est null.

De la spécification de langage Java, section 15.2.2, «Instance de comparaison de type instanceof»:

"Au moment de l'exécution, le résultat de    instanceof l'opérateur est true si la   valeur de la RelationalExpression  est   ne pas null et la référence pourrait être   jeté à la Type de référence   sans élever un ClassCastException.   Sinon, le résultat est false"

Donc, si l'opérande est nul, le résultat est faux.


1453
2018-06-01 14:05



Utiliser une référence null comme premier opérande instanceof résultats false.


237
2018-06-01 13:53



Très bonne question en effet. J'ai juste essayé pour moi-même.

public class IsInstanceOfTest {

    public static void main(final String[] args) {

        String s;

        s = "";

        System.out.println((s instanceof String));
        System.out.println(String.class.isInstance(s));

        s = null;

        System.out.println((s instanceof String));
        System.out.println(String.class.isInstance(s));
    }
}

Impressions

true
true
false
false

JLS / 15.20.2. Type de comparaison Opérateur

Au moment de l'exécution, le résultat de instanceof l'opérateur est true si la valeur du RelationalExpression n'est pas null et la référence pourrait être jeté à la Type de référence sans élever un ClassCastException. Sinon, le résultat est false.

API / Classe # isInstance (Object)

Si ce Class objet représente une interface, cette méthode renvoie true si la classe ou toute super-classe du spécifié Object l'argument implémente cette interface; ça revient false autrement. Si ce Class objet représente un type primitif, cette méthode renvoie false.


61
2017-07-29 11:55



Non ce n'est pas. instanceof retournerais false si son premier opérande est null.


23
2018-06-01 13:53



Non. Littéral Java null n'est pas une instance de n'importe quelle classe. Par conséquent, il ne peut pas être un exemple de n'importe quelle classe. instanceof  retournera soit false ou true Par conséquent, la <referenceVariable> instanceof <SomeClass> résultats false quand referenceVariable la valeur est nulle.


5
2018-05-27 10:59



le instanceof l'opérateur n'a pas besoin explicite null chèques, car il ne lance pas de NullPointerException si l'opérande est null.

Au moment de l'exécution, le résultat de instanceof L'opérateur est vrai si la valeur de l'expression relationnelle n'est pas null et la référence pourrait être convertie en type de référence sans déclencher une exception de type cast.

Si l'opérande est null, la instanceof l'opérateur retourne false et par conséquent, les vérifications nuls explicites ne sont pas nécessaires.

Considérez l'exemple ci-dessous,

public static void main(String[] args) {
         if(lista != null && lista instanceof ArrayList) {                     //Violation
                System.out.println("In if block");
         }
         else {
                System.out.println("In else block");
         }
}

L'utilisation correcte de instanceof est comme indiqué ci-dessous,

public static void main(String[] args) {
      
         if(lista instanceof ArrayList){                     //Correct way
                  System.out.println("In if block");
         }
            else {
                 System.out.println("In else block");
         }  
}

2
2018-04-01 08:09



Juste comme friandise:

Même (((A)null)instanceof A) reviendra false.


(Si typecasting null semble surprenant, parfois vous devez le faire, par exemple dans des situations comme celle-ci:

public class Test
{
  public static void test(A a)
  {
    System.out.println("a instanceof A: " + (a instanceof A));
  }

  public static void test(B b) {
    // Overloaded version. Would cause reference ambiguity (compile error)
    // if Test.a(null) was called without casting.
    // So you need to call Test.test((A)null) or Test.test((B)null).
  }
}

Alors Test.test((A)null) imprimera a instanceof A: false.)


P.S .: Si vous embauchez, veuillez ne pas l'utiliser comme question d'entrevue d'emploi. :RÉ


2
2018-03-22 12:11