Colección de soluciones de excepción de puntero nulo de Java (reproducida) (Excepción en el hilo "principal" java.lang.NullPointerException)

1) Llame a los métodos equals () y equalsIgnoreCase () desde objetos String conocidos en lugar de objetos desconocidos.

Llame siempre al método equals () desde un objeto String no vacío conocido. Debido a que el método equals () es simétrico, llamar a a.equals (b) y llamar a b.equals (a) son exactamente lo mismo, razón por la cual los programadores son tan descuidados con los objetos ay b. Si la persona que llama es un puntero nulo, esta llamada puede causar una excepción de puntero nulo

 Object unknownObject = null;
//错误方式 – 可能导致 NullPointerException
if (unknownObject.equals("knownObject")) {
        System.err.println("This may result in NullPointerException if unknownObject is 
        null");
}
//正确方式 - 即便 unknownObject是null也能避免NullPointerException
if ("knownObject".equals(unknownObject)) {
        System.err.println("better coding avoided NullPointerException");
}


Esta es la técnica Java más simple para evitar excepciones de puntero nulo, pero puede conducir a grandes mejoras porque equals () es un método común.

2) Cuando valueOf () y toString () devuelven el mismo resultado, prefiero usar el primero.

Debido a que llamar a toString () de un objeto nulo arrojará una excepción de puntero nulo, si podemos usar valueOf () para obtener el mismo valor, preferiríamos usar valueOf (), pasando un valor nulo a valueOf () devolverá "null", especialmente En esas clases de empaquetado, como Integer, Float, Double y BigDecimal.

BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不会抛出空指针异常
System.out.println(bd.toString()); //抛出 "Exception in thread "main" java.lang.NullPointerException"


3) Utilice bibliotecas y métodos seguros para nulos: hay muchas bibliotecas de código abierto que han realizado una gran comprobación de punteros nulos por usted. Uno de los más utilizados es StringUtils en Apache commons. Puede utilizar StringUtils.isBlank (), isNumeric (), isWhiteSpace () y otros métodos de herramientas sin preocuparse por las excepciones de puntero nulo.

//StringUtils方法是空指针安全的,他们不会抛出空指针异常
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
 
Output:
true
true
false
false


 
Pero antes de llegar a una conclusión, no olvide leer la documentación de la clase para el método de puntero nulo. Esta es otra de las mejores prácticas de Java que se puede mejorar enormemente sin mucho esfuerzo.

4) Evite devolver un puntero nulo del método, pero devuelva una colección vacía o una matriz vacía.

Esta mejor práctica o técnica de Java es mencionada por Joshua Bloch en su libro Effective Java. Esta es otra técnica que puede utilizar mejor la programación Java. Al devolver una colección vacía o una matriz vacía, puede asegurarse de que las llamadas como size (), length () no se bloqueen debido a una excepción de puntero nulo. La clase Colecciones proporciona listas, conjuntos y mapas vacíos convenientes: Colecciones.EMPTY_LIST, Colecciones.EMPTY_SET, Colecciones.EMPTY_MAP. Aquí hay un ejemplo.

public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}


También puede utilizar Collections.EMPTY_SET y Collections.EMPTY_MAP en lugar de punteros nulos.

5) Utilice la anotación @ NotNull y @Nullable

Puede definir si puede ser un puntero nulo al escribir un programa. Declare si un método es seguro para el puntero nulo mediante anotaciones como @NotNull y @Nullable. Los compiladores, IDE o herramientas modernos pueden leer esta anotación y ayudarlo a agregar verificaciones de puntero nulo olvidadas, o solicitarle verificaciones de puntero nulo desordenadas e innecesarias. IntelliJ y findbugs ya admiten estas anotaciones. Estas anotaciones también forman parte de JSR 305, pero incluso si no están en el IDE o la herramienta, la anotación en sí se puede utilizar como documento. Al ver @NotNull y @Nullable, los programadores pueden decidir si comprobar si hay punteros nulos. Por cierto, esta técnica es relativamente nueva para los programadores de Java y llevará algún tiempo adoptarla.

6) Evite el empaquetado automático innecesario y el desempaquetado automático en su código.

Independientemente de otras deficiencias, como la creación de objetos temporales, si el objeto de la clase contenedora es nulo, el ajuste automático también es propenso a provocar una excepción de puntero nulo. Por ejemplo, si el objeto de persona no tiene un número de teléfono, devolverá nulo. El siguiente código fallará debido a una excepción de puntero nulo.

Person ram = new Person("ram");
int phone = ram.getPhone();


Al usar el empaquetado automático y el desempaquetado automático, no solo se lanzará el signo igual, sino también una excepción de puntero nulo. Puede obtener más información sobre las trampas del empaquetado y desempaquetado automático en Java a través de este artículo.

7) Siga el contrato y defina valores predeterminados razonables.

Una de las mejores formas de evitar las excepciones de puntero nulo en Java es simplemente definir contratos y seguirlos. La mayoría de las excepciones de puntero nulo se producen porque el objeto se crea con información incompleta o no se proporcionan todas las dependencias. Si no permite la creación de objetos incompletos y rechaza correctamente estas solicitudes, puede evitar una gran cantidad de excepciones de puntero nulo en los trabajadores posteriores. Del mismo modo, si se permite la creación de objetos, debe definir un valor predeterminado razonable para ellos. Por ejemplo, un objeto Empleado no se puede crear sin una identificación y un nombre, pero si tiene un número de teléfono es opcional. Ahora, si el empleado no tiene un número de teléfono, puede devolver un valor predeterminado (como 0) en lugar de devolver un valor nulo. Pero debe elegir con cuidado. A veces es más conveniente comprobar si hay un puntero nulo que llamar a un número no válido. De manera similar, al definir qué puede ser nulo y qué no puede ser nulo, la persona que llama puede tomar una decisión informada. Fallar rápidamente o aceptar nulo también es una decisión de diseño importante que debe elegir e implementar

8) Defina si el campo de la base de datos puede estar vacío.

Si está utilizando una base de datos para almacenar los objetos de su nombre de dominio, como Clientes, Pedidos, etc., debe definir la restricción nula en la propia base de datos. Debido a que la base de datos obtendrá datos de una gran cantidad de código, hay una verificación para ver si la base de datos está vacía para garantizar que sus datos estén en buen estado. Mantener restricciones nulas en el espacio de datos también puede ayudarlo a reducir las comprobaciones de punteros nulos en el código Java. Al cargar un objeto desde la base de datos, tendrá claro qué campos pueden ser nulos y cuáles no, lo que puede minimizar las comprobaciones! = Null innecesarias en su código.

9) Usar patrón de objeto nulo

Hay otra forma de evitar la excepción de puntero nulo en Java. Si un método devuelve un objeto, realice algunas operaciones en el llamador, por ejemplo, el método Collection.iterator () devuelve un iterador y el llamador realiza un recorrido. Suponga que si un llamador no tiene iteradores, puede devolver un objeto nulo en lugar de nulo. El objeto vacío es un objeto especial, que tiene diferentes significados en diferentes contextos. Por ejemplo, un iterador vacío puede ser un objeto vacío cuando llamar a hasNext () devuelve falso. De manera similar, en los ejemplos de métodos que devuelven tipos de contenedor y colección, se pueden usar objetos vacíos en lugar de nulos como valor de retorno. Planeo escribir otro artículo sobre el patrón de objetos vacíos y compartir algunos ejemplos de objetos vacíos de Java.

Supongo que te gusta

Origin blog.csdn.net/qq_36766417/article/details/105988180
Recomendado
Clasificación