Na linguagem Java, lidar com ponteiros nulos costuma ser uma dor de cabeça.Se você não for cuidadoso, poderá encontrar um bug on-line para obter sua avaliação de desempenho em 3,25. Acredito que todos tenham ouvido falar sobre o recém-lançado Java14 recentemente, então vamos dar uma olhada hoje. Diante do NullPointerException, que maneiras melhores de lidar com o Java14?
1. NullPointerException Tradicional
Em nosso processo de codificação, geralmente usamos chamadas encadeadas para escrever código, o que é muito conveniente e claro de escrever, mas uma vez que ocorre uma NullPointerException, ela é muito grande, porque é difícil saber quando é a exceção. Começou a acontecer.
Para um exemplo simples, como o código a seguir, para encontrar a localização do registro doméstico de um funcionário da empresa, chamamos
String city = employee.getDetailInfos().getRegistryAddress().getCity();
No processo de chamadas encadeadas, se employee
, getDetailInfos()
ou getRegistryAddress()
está vazio, JVM lança NullPointerException
,
em seguida, levou a que a causa raiz é anormal? Sem um depurador, é difícil determinar qual variável está vazia. Além disso, a JVM imprimirá apenas o método, o nome do arquivo e o número da linha que causou a exceção, só isso.
Em seguida, o seguinte, eu vou levá-lo para encontrar Java 14 como JEP 358
resolver este problema.
2. NullPointerException aprimorada
A SAP implementou uma NullPointerException aprimorada para sua JVM comercial em 2006 . Em fevereiro de 2019, foi proposto como um aprimoramento para a comunidade OpenJDK e, logo depois, tornou-se um JEP. Portanto, esse recurso foi concluído em outubro de 2019 e lançado no JDK 14 .
Essencialmente, o JEP 358 visa melhorar a legibilidade da "NullPointerException" gerada pela JVM , descrevendo uma variável como " nula" .
O JEP 358 traz uma mensagem detalhada de NullPointerException , descrevendo a variável como nula ao lado do método, nome do arquivo e número da linha . Ele funciona analisando as instruções de bytecode do programa. Portanto, ele pode determinar com precisão qual variável ou expressão é nula . Mais importante, as mensagens de exceção detalhadas são desativadas por padrão no JDK 14 . Para habilitá-lo, precisamos usar opções de linha de comando:
-XX:+ShowCodeDetailsInExceptionMessages
2.1 Informações detalhadas sobre exceções
Considere ativar ShowCodeDetailsInExceptionMessages
execute o código novamente sob a bandeira 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)
Desta vez, pelas informações adicionais, sabemos que a perda do endereço registrado dos dados pessoais do funcionário causou nossa anomalia. As informações obtidas com esse aprimoramento podem economizar tempo na depuração.
A JVM consiste em duas partes para criar mensagens de exceção detalhadas. A primeira parte representa o fracasso operação, que é referido como nulo resultado, enquanto o segundo identifica parte do nulo citou razões:
Cannot invoke "String.toLowerCase()" because the return value of "getEmailAddress()" is null
Para gerar mensagens de exceção, o JEP 358 refatorou parte do código-fonte que empurrou referências nulas para a pilha de operandos.
3. Aspectos técnicos
Agora que temos um bom entendimento de como usar NullPointerException s aprimoradas para identificar referências nulas , vamos dar uma olhada em alguns de seus aspectos técnicos.
Primeiro, somente quando a própria JVM lança uma NullPointerException , o cálculo detalhado da mensagem será executado.Se lançarmos explicitamente uma exceção no código Java, o cálculo não será executado. O motivo é que: nesses casos, é provável que uma mensagem significativa tenha sido passada no construtor de exceções.
Em segundo lugar, o ** JEP 358 ** calcula as mensagens preguiçosamente, o que significa que a NullPointerException aprimorada é chamada apenas quando imprimimos a mensagem de exceção, não quando a exceção ocorre. Portanto, não deve haver nenhum impacto no desempenho no processo comum da JVM, onde podemos capturar e repetir exceções, porque não queremos apenas imprimir mensagens de exceção.
Finalmente, as mensagens de exceção detalhadas podem conter nomes de variáveis locais no código-fonte . Portanto, podemos considerar esse risco potencial à segurança. No entanto, isso acontece apenas ao executar o código compilado com o sinalizador -g ativado , que gera informações de depuração e as adiciona ao arquivo de classe.
Considere um exemplo simples, que compilamos para incluir as seguintes informações adicionais de depuração:
Employee employee = null;
employee.getName();
Quando o código acima é executado, o nome da variável local será impresso nas informações da exceção:
"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"
because "employee" is null
Pelo contrário, sem informações adicionais de depuração, a JVM fornece apenas as variáveis que conhece na mensagem detalhada:
Cannot invoke
"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"
because "<local1>" is null
A JVM imprime o índice de variável designado pelo compilador em vez do nome da variável local (funcionário).
O processamento do NullPointerException está aqui: com o NullPointerException aprimorado para Java14, podemos localizar rapidamente a causa dos problemas de código, depurar o código mais rapidamente, economizar tempo e melhorar a eficiência.
Amigos que instalaram o Java14 podem experimentá-lo ~
Ding Ding Ding! Preste atenção ao número público: o grandalhão do lado de fora do pote, junte-se ao círculo externo do pote, e o resultado do bem-estar é irregular. Olá, recebê-lo para participar
Endereço do blog: http://www.developlee.top