49 votes

Comment faire pour invoquer une méthode (statique) sur une référence null ne lance pas NullPointerException?

J'ai écrit ce programme en Java

 public class Why {

  public static void test() {
    System.out.println("Passed");
  }

  public static void main(String[] args) {
    Why NULL = null;
    NULL.test();
  }

}
 

J'ai lu que l'invocation d'une méthode sur un objet null cause NullPointerException , et pourtant le programme ci-dessus ne le fait pas? Pourquoi est-ce? Est-ce que je ne comprends pas quelque chose correctement?

80voto

polygenelubricants Points 136838

test() est static méthode. Un static membre appartient au type, et ne nécessitent pas une instance d'access.

Un static membre devrait SEULEMENT être accessibles via une expression de type. C'est à dire, vous avez écrit comme suit:

Why.test(); // always invoke static method on the type it belongs to!

Java vous permet d'accéder à un static membre par l'intermédiaire d'un objet de référence de l'expression, mais c'est TRÈS trompeur, car ce n'est PAS le réel de la sémantique d'un static accès membre.

Why aNull = null; 
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException

Lorsque vous accédez à un static membre par le biais d'une référence d'objet de l'expression, seul le type déclaré de la référence en la matière. Cela signifie que:

  • Il n'a pas d'importance si la référence est en fait null, car aucune instance n'est requis
  • Si la référence n'est pas null, il n'a pas d'importance ce que le runtime type de l'objet est, il n'y a pas de répartition dynamique!!!

Comme vous pouvez le voir, les exacts opposés sont vrai sur ces deux points, par exemple l'accès des membres. C'est pourquoi, static membres devraient JAMAIS être accessible dans un "non-static", parce que cela donne une apparence trompeuse sur ce qu'est réellement en train de faire.

Questions connexes

3voto

MrJacqes Points 305

Vous devez activer les différents avertissements dans votre IDE. Il y a des chances que vous voyiez un avertissement concernant l'accès à un membre statique de manière non statique.

Vous pouvez faire quelque chose comme (Why) (null) .test (), il utilise seulement le (Why) (null) pour obtenir la classe.

3voto

Vlad Points 3199

Les méthodes statiques n'ont pas besoin d'une référence à l'objet. Vous pouvez donc l'appeler même si la référence à l'objet est nulle. Voilà comment fonctionne la méthode principale.

Essayez de supprimer la désignation statique de l'objet pour voir l'exception de pointeur null.

3voto

JohnFx Points 23761

C'est une méthode statique, qui vous permet d'appeler des méthodes dessus sans instancier d'instance.

1voto

Rupesh Yadav Points 2721

Variable statique & Méthodes sont associées à la classe, plutôt qu'avec n'importe quel objet. Chaque instance de la classe d'actions d'une variable de classe, qui est dans un emplacement fixe dans la mémoire.

Tout objet peut changer la valeur d'une variable de classe, mais la classe de variables peuvent également être manipulées sans la création d'une instance de la classe et de même pour la Méthode Statique. pour plus de renvoyer cette.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X