La clase Optional de Java para evitar la excepción NullPointerException

Escrito por el .
java planeta-codigo programacion
Enlace permanente Comentarios

Con la clase Optional añadida en el JDK en la versión 8 del lenguaje Java se puede evitar una de las excepciones más comunes que se produce cuando se hace uso de una referencia nula a un objeto.

Java

Una de las excepciones que más se producen en un programa hecho con el lenguaje Java es la conocida NullPointerException que ocurre cuando se hace uso de una variable que referencia a un objeto pero que el contenido de la variable es null, sin valor o sin contener una referencia a un objeto de modo que la llamada al método no es posible. La excepción NullPointerException extiende de RuntimeException por lo que es una unchecked exception y por ello no es necesario capturarla o lanzarla, cuando se produce hay un error en el programa.

Entre las novedades que Java 8 incluyó en el lenguaje y JDK está la inclusión de la clase Optional con la que haciendo uso de ella se pueden evitar los NullPointerException. Un objeto de tipo Optional contiene o no una referencia a otro tipo de objeto. Por ejemplo, una variable de tipo Optional<String> contiene una referencia a un objeto Optional que a su vez contiene o no una referencia a una cadena String. El uso de la variable Optional no producirá un NullPointerException y con sus métodos es posible saber si contiene o no una referencia al tipo usado en el genérico. Con el método isPresent() es posible saber si el Optional contiene una referencia, con orElse() y orElseGet() se obtiene la referencia que indiquemos en caso de que no tenga una referencia y con los métodos estáticos a modo de constructores of() y ofNullable() se obtiene respectivamente una instancia de Optional con la referencia indicada que no puede ser nula o un Optional que podría contener una referencia nula.

Usar un objeto Optional advierte al programador de que la referencia que contiene puede ser nula y usada correctamente evita los NullPointerException aunque usarla indiscriminadamente hace del código más incómodo de escribir y leer, en variables locales es prescindible su uso pero útil en algunos valores de retorno o parámetros de métodos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ java -version
java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)

$ jshell
|  Welcome to JShell -- Version 10.0.1
|  For an introduction type: /help intro

jshell> String string = null;
string ==> null

jshell> System.out.println(string.toLowerCase());
|  java.lang.NullPointerException thrown
|        at (#2:1)

// Optional
jshell> Optional<String> optional = Optional.ofNullable(string);
optional ==> Optional.empty

jshell> if (optional.isPresent()) {
   ...>   System.out.println(optional.get().toLowerCase());
   ...> }

jshell> System.out.println(optional.orElse("null").toLowerCase());
null
jshell.sh

Hay algunos métodos más en la clase Optional con algunas funcionalidades adicionales que hace uso de las nuevas capacidades funcionales del lenguaje como convertir un Optional a un Stream.


Comparte el artículo: