NullPointerException

Nullabilité des objets en Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Un point pouvant empêcher les développeurs PHP qui se lancent en Java, à dormir tranquillement, sont des excpetions provoquées par nullabilité d'un objet ou d'une opération. Les exceptions lancées s'appellent NullPointerException.

Une NullPointerException a lieu quand on essaie d'utiliser une référence qui ne pointe pas vers un objet. Elle s'applique également aux champs null d'un objet et aux tableaux. Comment on peut alors l'éviter ? Voici quelques moyens pour ne plus provoquer desNullPointerException :

Condition if-else

Il suffit de vérifier si la référence pointe vers un objet quelconque. Voici l'exemple :

public class Nulls { 
  public static void main(String[] args) {
    System.out.println(parseName("test"));
    System.out.println(parseName(null));
  }

  private static int parseName(String l) {
    if (l == null) return 0;
    return l.length();
  }
}

Sur l'écran on verra :

4 0

L'utilisation du Null Object pattern

On peut éviter des NullPointerException également grâce à un patron de conception, appelé Null Object. Il fournit un comportement adapté aux références ne pointant vers aucun objet. On appele cela une implémentation du "do nothing" dans le code. Il s'agit donc d'un type du patron comportemental. Constatons cela sur un exemple :

afficher le code

L'écran affichera :

Customer name is

Dans ce cas une NullPointerException ne sera jamais lancée car on utilisera toujours un objet Customer valable.

Monade Option en Java

On peut également totalement éliminer la présence des références null grâce au monade appelé Option. Il ressemble un peu au cas décrit au-dessus. Sa spécificé repose sur le fait de permettre de gérer une succession d'opérations sans se préoccuper de la présence ou de l'absence d'une valeur. Dans le cas de la problématique abordée, il s'agit plus précisement de l'élimination de NullPointerException. Regardons et commentons le code ci-dessous :

afficher le code

Et voici le résultat :

familyMap is {Julie={Alex_Barbara=Cedric_Dorothee}}
Found Julie's grandparents : Cedric_Dorothee

Cette technique nous permet de gérer les maps à plusieurs niveaux différents. Si l'on traitait une Map à 3 profondeurs, il suffirait de rajouter un appel de la méthode andThen().

Comment alors marche ce code qui à premier vue paraît un peu confus ? Tout d'abord on devrait noter l'absence des deux classes héritantes de la classe Option, None et Some. La première classe représente l'élément absent dans la liste. Elle retourne false dans la vérification de présence (isPresent()). L'autre, contrairement à la première, traite les éléments présents et retourne true dans la méthode adaptée à la vérification (isPresent. Passons maintenant à l'objet Function conçu dans la méthode getFromKey(). Cet objet est soit un None, soit un Some. Ceci dit, dès qu'une clé est absente, on le signale et va directement à la fin de recherche. Par contre, si la clé est trouvée, le travail de recherche continue en diminuant le nombre de maps à parcourir. On pourrait illustrer ce processus aussi avec la descente d'un arbre. Tant que la branche ne se casse pas, on peut continuer et arriver sur terre.

Bartosz KONIECZNY Informations sur le langage

Une question ? Une remarque ?

*

*

Un conseil PHP

Comment créer un signature key pour OAuth

Un signature key est l'un des deux composants qui constituent la signature de la requête OAuth. Il est composé de : - la clé secrète que le fournisseur (Google, Yahoo...) attribue au client, elle doit être toujours présente dans le signature key - le ticket secret qui est renvoyé à de différentes étapes de l'échange avec le web service du fournisseur; s'il est absent (comme lors de la récupération du ticket de la requête), il faut alors passer une chaîne de caractères vide Les deux paramètres doivent être encodés. Une méthode pour générer le signature key peut se présenter ainsi :

function setSignatureKey($tokenSecret)
{
  return str_replace('%7E', '~', rawurlencode($this->userData['secret'])).'&'.str_replace('%7E', '~', rawurlencode($tokenSecret));
}