Para aprender a evitar un error, primero debemos entender el error.
NullPointerException es una RuntimeException. En Java , se puede asignar un valor nulo especial a una referencia de objeto. NullPointerException se lanza cuando el programa intenta usar una referencia de objeto que tiene el valor nulo.
Estos pueden ser:
- Invocar un método desde un objeto nulo.
- Acceder o modificar el campo de un objeto nulo.
- Tomando la longitud de nulo, como si fuera un arreglo.
- Accediendo o modificando las ranuras del objeto nulo, como si fuera una array.
- Lanzar nulo, como si fuera un valor Throwable.
- Cuando intenta sincronizar sobre un objeto nulo.
Ejemplo:
// Java program to show NullPointerException public class Example { public static void main(String[] args) { // Create a String of size 10 String[] a = new String[10]; // The String is empty // So a[1] will have null at present String upcase = a[1].toUpperCase(); System.out.print(upcase); } }
Producción:
Exception in thread "main" java.lang.NullPointerException at Example.main(Example.java:4)
¿Cómo evitar NullPointerException con una clase opcional?:
Java 8 ha introducido una nueva clase Opcional en el paquete java.util . Puede ayudar a escribir un código ordenado sin usar demasiadas comprobaciones nulas. Al usar Opcional, podemos especificar valores alternativos para devolver o código alternativo para ejecutar. Esto hace que el código sea más legible porque los hechos que estaban ocultos ahora son visibles para el desarrollador.
Optional Class
Optional es un objeto contenedor que puede contener un valor nulo o no nulo. Básicamente comprueba si la dirección de memoria tiene un objeto o no. Si hay un valor presente, isPresent() devolverá verdadero y get() devolverá el valor. Se proporcionan métodos adicionales que dependen de la presencia o ausencia de un valor contenido, como orElse() que devuelve un valor predeterminado si el valor no está presente e ifPresent() que ejecuta un bloque de código si el valor está presente. Esta es una clase basada en valores, es decir, sus instancias son:
- Final e inmutable (aunque puede contener referencias a objetos mutables).
- Se considera igual únicamente en función de equals(), no en función de la igualdad de referencia (==).
- No tiene constructores accesibles.
Sintaxis:
Optional is a generic type of type T. Optional<T>
Rectificando el código para la NullPointerException anterior usando la clase opcional:
// Java program to avoid NullPointerException // using Optional Class import java.util.Optional; public class Example { public static void main(String[] args) { // Create a String of size 10 String[] a = new String[10]; // Create an Optional Class instance // and get the state for a[1] element // for Null value Optional<String> check = Optional.ofNullable(a[1]); // If the value in the current instance is null, // it will return false, else true if (check.isPresent()) { // The String is empty // So a[1] will have null at present String upcase = a[1].toUpperCase(); System.out.print(upcase); } else // As the current value is null System.out.println("String value is not present"); } }
String value is not present
Nota: Por lo tanto, esto puede entenderse como un método de manejo de excepciones para NullPointerException
Manejo de NullPointerException utilizando la clase opcional:
// Java program to handle NullPointerException // using Optional Class import java.util.Optional; public class Example { public static void main(String[] args) { // Create a String of size 10 String[] a = new String[10]; // Define the a[1] element a[1] = "geeksforgeeks"; // Create an Optional Class instance // and get the state for a[1] element // for Null value Optional<String> check = Optional.ofNullable(a[1]); // If the value in the current instance is null, // it will return false, else true if (check.isPresent()) { // The String is not empty // So a[1] will have a value at present String upcase = a[1].toUpperCase(); System.out.print(upcase); } else // If the current value is null System.out.println("String value is not present"); } }
GEEKSFORGEEKS
Publicación traducida automáticamente
Artículo escrito por vishodushaozae y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA