Nueva forma de manejar NullPointerException, Java14 es realmente fragante

En el lenguaje Java, lidiar con punteros nulos es a menudo un dolor de cabeza. Si no tiene cuidado, puede encontrar un error en línea para llevar su evaluación de rendimiento a 3.25. Creo que todo el mundo ha escuchado sobre el recientemente lanzado Java14 recientemente, así que echemos un vistazo hoy. Frente a NullPointerException, ¿qué mejores maneras de lidiar con Java14?

1. Excepción tradicional de puntero nulo

En nuestro proceso de codificación, a menudo usamos llamadas encadenadas para escribir código, lo cual es muy conveniente y claro para escribir, pero una vez que ocurre una NullPointerException, es demasiado grande, porque es difícil saber cuándo es la excepción. Comenzó a suceder.
Para un ejemplo simple, como el siguiente código, para encontrar la ubicación del registro familiar de un empleado de la empresa, llamamos

String city = employee.getDetailInfos().getRegistryAddress().getCity();

En el proceso de llamadas encadenadas, si employee, getDetailInfos()o getRegistryAddress()está vacía, JVM tiros NullPointerException,
luego dio lugar a lo que la causa fundamental es anormal? Sin un depurador, es difícil determinar qué variable está vacía. Además, la JVM solo imprimirá el método, el nombre del archivo y el número de línea que causó la excepción, eso es todo.
A continuación, el siguiente, que le llevará a encontrar Java 14 cómo JEP 358resolver este problema.

2. NullPointerException mejorada

SAP implementó una NullPointerException mejorada para su JVM comercial en 2006 . En febrero de 2019, se propuso como una mejora para la comunidad OpenJDK, y poco después, se convirtió en un JEP. Por lo tanto, esta característica se completó en octubre de 2019 y se lanzó en JDK 14 .
Esencialmente, JEP 358 tiene como objetivo mejorar la legibilidad de la "NullPointerException" generada por la JVM al describir una variable como " nulo" .
JEP 358 trae un mensaje NullPointerException detallado al describir la variable como nula junto al método, nombre de archivo y número de línea . Funciona analizando las instrucciones de bytecode del programa. Por lo tanto, puede determinar con precisión qué variable o expresión es nula . Lo más importante, los mensajes de excepción detallados están desactivados por defecto en JDK 14 . Para habilitarlo, necesitamos usar las opciones de línea de comando:

-XX:+ShowCodeDetailsInExceptionMessages

2.1 Información de excepción detallada

Considerar la activación de ShowCodeDetailsInExceptionMessagesejecutar el código de nuevo bajo la bandera de:

Exception in thread "main" java.lang.NullPointerException: 
  Cannot invoke "RegistryAddress.getCity()" because the return value of 
"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$DetailInfos.getRegistryAddress()" is null
  at com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.main(HelpfulNullPointerException.java:10)

Esta vez, a partir de la información adicional, sabemos que la pérdida de la dirección registrada de los datos personales del empleado causó nuestra anomalía. La información obtenida de esta mejora puede ahorrarnos tiempo en la depuración.

La JVM consta de dos partes para crear mensajes de excepción detallados. La primera parte representa el fracaso operación, que se conoce como nulo resultado, mientras que la segunda parte identifica el nulo citadas razones:

Cannot invoke "String.toLowerCase()" because the return value of "getEmailAddress()" is null

Para generar mensajes de excepción, JEP 358 refactorizó parte del código fuente que introdujo referencias nulas en la pila de operandos.

3. Aspectos técnicos.

Ahora que tenemos una buena comprensión de cómo usar las NullPointerException mejoradas para identificar referencias nulas , echemos un vistazo a algunos de sus aspectos técnicos.

Primero, solo cuando la propia JVM arroja una NullPointerException , se realizará el cálculo detallado del mensaje. Si arrojamos explícitamente una excepción en el código Java, el cálculo no se realizará. La razón es porque: en estos casos, es probable que se haya pasado un mensaje significativo en el constructor de excepciones.

En segundo lugar, ** JEP 358 ** calcula el mensaje de manera perezosa, lo que significa que la excepción NullPointerException mejorada solo se llama cuando imprimimos el mensaje de excepción, no cuando ocurre la excepción. Por lo tanto, no debería haber ningún impacto en el rendimiento del proceso JVM habitual, donde podemos capturar y volver a generar excepciones, porque no solo queremos imprimir mensajes de excepción.

Finalmente, los mensajes de excepción detallados pueden contener nombres de variables locales en el código fuente . Por lo tanto, podemos considerar que esto es un riesgo potencial de seguridad. Sin embargo, esto solo ocurre cuando se ejecuta código compilado con el indicador -g activado , que genera información de depuración y la agrega al archivo de clase.
Considere un ejemplo simple, que hemos compilado para incluir la siguiente información adicional de depuración:

Employee employee = null;
employee.getName();

Cuando se ejecuta el código anterior, el nombre de la variable local se imprimirá en la información de excepción:

"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"
because "employee" is null

Por el contrario, sin información de depuración adicional, la JVM solo proporciona las variables que conoce en el mensaje detallado:

Cannot invoke 
  "com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"
because "<local1>" is null

La JVM imprime el índice de variable asignado por el compilador en lugar del nombre de la variable local (empleado).

El procesamiento de NullPointerException ha terminado aquí. Con Java14 mejorado NullPointerException, podemos localizar rápidamente la causa de los problemas de código, depurar código más rápido, ahorrar tiempo y mejorar la eficiencia.

Los amigos que han instalado Java14 pueden probarlo ~

Ding Ding Ding! Presta atención al número público: el tipo grande fuera de la olla, únete al círculo exterior de la olla, y la producción de bienestar es irregular. Hola, te invitamos a unirte.
Dirección del blog: http://www.developlee.top

Supongo que te gusta

Origin www.cnblogs.com/liululee/p/12702993.html
Recomendado
Clasificación