quinta-feira, 13 de novembro de 2014

Regex para identificar possíveis causas de NullPointerException

 Olá amigos leitores, o objetivo do post de hoje será construir uma regex que possa identificar possíveis causas de NullPointerException em nosso código Java.

Para que você possa entender o que está sendo falado aqui, é de suma importância que você tenha algum conhecimento sobre regex.

Bem, vamos começar !!! Você sabe o que é um NullPointerException ?

NullPointerException é uma exceção da linguagem Java que, denota um acesso à algum conteúdo(atributo ou método) a partir de uma referência (instância) nula.

Vamos ao exemplo.

 public void foo(){  
      MinhaClasse obj = null;  
      obj.foo2();  
 }  

O código acima irá gerar um NullPointerException porque a instância obj é nula. Sendo assim, não será possível executar o método foo2(). Caso você possua dúvidas com a exceção NullPointerException, deixe sua dúvida nos comentários que eu responderei.

Agora, imagine que você está em um projeto onde existem vários programadores trabalhando ao mesmo tempo e você não tem idéia de como analisar ou, impedir que erros de NullPointer aconteçam por erro de escrita de código do desenvolvedor. Logo, você só tem uma única opção, que é: esperar e ver o que irá acontecer quando o programa for executado.

Pensando nisso, desenvolvi uma regex que pode ser usada no search da sua IDE favorita a fim de, identificar trechos de código que podem ser NullPointerException em potencial.

 [^\"\"]\.(equals|equalsIgnoreCase|startsWith|endsWith)\((\".*\")\)  

Vamos às explicações. Primeiro,  temos que ter noção de estamos trabalhando com intervalos abertos logo, não podemos usar o ^ e o $. Agora, vamos destrinchar ela.

[^\"\"] -> Intervalo de caracteres que não quero encontrar. Representa uma operação de complemento. O acento circunflexo é necessário nesta operação porque, ele que representa o complemento.
\. -> Representa o caracter ponto(.) de acesso à métodos. Utilizo a barra (\) pois o ponto (.) tem significado em regex.
(equals|equalsIgnoreCase|startsWith|endsWith) -> Represento a inferência lógica "or" onde, os valores são os métodos que queremos verificar.
\( -> Representa o caracter parênteses (. Utilizo a barra pois, o parênteses possui significado em regex.
(\".*\") -> Representa o qualquer coisa escrita entre aspas. O ponto (.) representa qualquer caracter e o asterisco (*) representa várias ocorrências de algo.
\) -> Representa o caracter parênteses ). Utilizo a barra pois, o parênteses possui significado em regex.

Viu ??? Não é difícil ! Agora é só usar e ser feliz !!! Boa sorte na sua otimização de código.

Dúvidas ? Sugestões ? Melhorias ? Comente aí embaixo.

Nenhum comentário: