English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Breve discussão sobre o tratamento de exceções de ponteiros nulos em Java

O professor disse que na aprendizagem futura, a maioria das exceções serão exceções de ponteiros nulos. Portanto, tire um pouco de tempo para jogar e consultar o que é exceção de ponteiros nulos

Primeiro: as principais causas de exceções de ponteiros nulos são:

(1)Quando um objeto não existe e seu método é chamado, será gerado uma exceção obj.method() // O objeto obj não existe

(2)Quando acessar ou modificar um campo de um objeto inexistente, será gerado uma exceção obj.method() // Método method não existe

(3)A variável de string não foi inicializada;

(4)O objeto de tipo interface não foi inicializado com uma classe específica, por exemplo:

List lt; gerará erro
List lt = new ArrayList(); então não aparecerá erro

Quando o valor de um objeto estiver vazio, você não avaliou o caso de estar vazio. Tente adicionar uma linha de código antes do código abaixo:

if(rb!=null && rb!="") 

Modifique para:

if(rb==null); 
if(rb!==null&&rb!="") ou if(("").equals(rb)) 

Soluções para o problema de ponteiros nulos:

Foque na linha onde o erro ocorreu, diagnostique o erro específico através dos dois principais motivos de geração de exceções de ponteiros nulos. Além disso, para evitar a ocorrência de ponteiros nulos, é melhor coloque 'null' ou valores vazios antes dos valores definidos ao fazer julgamento e tratamento.
 

Análise breve de exceções de ponteiros nulos comuns:

(1Erro de ponteiro nulo Java.lang.NullPointerException

No Java8Os tipos de dados básicos, os valores das variáveis podem ter valores padrão, se não forem atribuídos valores normais, o Java Virtual Machine não pode compilar corretamente, portanto, ao usar tipos de dados Java básicos, geralmente não são causados por exceções de ponteiros nulos. Na prática, a maioria das exceções de ponteiros nulos está relacionada às operações de objetos.

Segundo, o mecanismo de tratamento de exceções do Java

Existem duas maneiras de lidar com códigos que podem gerar exceções:

Primeiro, capture e trate exceções usando a estrutura try...catch no método, pode haver várias sentenças catch, usadas para coincidir com várias exceções. Por exemplo:

public void p(int x){}
try{
...
}catch(Exception e){
...
}finally{
...
}}

Segundo, para exceções que não podem ser tratadas ou que precisam ser transformadas, declare-as no cabeçalho do método

A sentença throws lança exceções. Por exemplo:

public void test1() throws MyException{
...
if(....){
throw new MyException();
}}

Se cada método lançar exceções simples, o Java Virtual Machine buscará, a partir do bloco de código onde a exceção ocorreu, até encontrar o bloco de código que trata a exceção. Em seguida, a exceção será entregue para a sentença catch correspondente. Se o Java Virtual Machine rastrear até o método main() na pilha de chamadas de métodos e ainda não encontrar um bloco de código que trate a exceção, ele procederá conforme as seguintes etapas:

Primeiro, chame o método printStackTrace() do objeto que lançou a exceção, para imprimir as informações de exceção da pilha de chamadas de métodos.

Segundo, se a thread que ocorre a exceção for a thread principal, o programa inteiro será interrompido; se não for a thread principal, a thread será encerrada e as outras threads continuarão a executar.

Pelo análise e reflexão, pode-se ver que, quanto mais cedo for tratada a exceção, menor será o consumo de recursos e tempo, e menor será o escopo de impacto. Portanto, não deve-se lançar exceções que podem ser tratadas por si mesmas para o chamador.

Além disso, não deve ser ignorado: a sentença finally deve ser executada em todas as circunstâncias, garantindo a confiabilidade de código que deve ser executado em todas as circunstâncias. Por exemplo, ao lidar com exceções de consulta de banco de dados, deve-se liberar conexões JDBC, etc. A sentença finally é executada antes da sentença return, independentemente da ordem de execução, e também da presença ou não de exceções no bloco try. A única situação em que a sentença finally não é executada é quando o método System.exit() é chamado. O System.exit() tem a função de encerrar o Java Virtual Machine que está em execução. Não é possível alterar o valor de retorno da sentença return dentro do bloco de sentença finally atribuindo um novo valor a uma variável, e é recomendável não usar a sentença return dentro do bloco finally, pois isso é inútil e pode levar a erros.

Também deve ser notado que as regras de sintaxe do tratamento de exceções:

Primeiro,A sentença try não pode existir sozinha, pode ser combinada com catch e finally

As estruturas try...catch...finally, try...catch e try...finally, a sentença catch pode ter uma ou mais, a sentença finally no máximo uma, e as palavras-chave try, catch e finally não podem ser usadas isoladamente.

Segundo:Os escopos das variáveis dentro dos bloco try, catch e finally são independentes e não podem ser acessados uns pelos outros. Se precisar que as variáveis sejam acessíveis em todos esses bloco, é necessário definir as variáveis fora desses bloco.

Terceiro:Quando há múltiplos bloco catch, o Java Virtual Machine (JVM) coincide com um tipo de exceção ou sua subclasse, e executa esse bloco catch, sem executar outros bloco catch.

Quarto:Não é permitido que haja outras sentenças imediatamente após a sentença throw, pois essas não têm chance de serem executadas.

Quinto:Se um método chamar outro método que declara uma exceção, esse método deve ou tratar a exceção ou declarar lançar.

2.2A diferença entre throw e throws:

throw é usado para lançar uma exceção, dentro do corpo do método. O formato sintático é: throw objeto_exceção.

throws é usado para declarar que um método pode lançar qual exceção, após o nome do método, o formato sintático é:

throws tipo de exceção1, tipo de exceção2...tipo de exceção n.

Terceiro: a seguir, estão listadas várias situações possíveis de exceção de ponteiro nulo e suas soluções correspondentes:

Trecho de código1:

out.println(request.getParameter("username")); 

Análise:Trecho de código1tem uma função muito simples, que é exibir o valor de entrada do usuário "username".

Nota:Parece que a sentença acima não apresenta erros de sintaxe e, na maioria das vezes, não há problemas. Mas, se um usuário não fornecer o valor do campo de formulário "username" ao digitar dados ou passar por algum meio para inserir diretamente, o valor de request.getParameter("username") será vazio (atente para que não seja uma string vazia, mas um objeto nulo null.), o método println do objeto out não pode operar diretamente sobre o objeto vazio, portanto o trecho de código1A página JSP correspondente lançará a exceção "Java.lang.NullPointerException". E mesmo que o objeto possa estar vazio, também chama métodos como toString(), equal(Object obj) e outros da classe Java.lang.Object ou do objeto Object em si.

Trecho de código2:

String userName = request.getParameter("username"); 
  If (userName.equals("root")) 
  {....} 

Análise:Trecho de código2A função é detectar o nome de usuário fornecido pelo usuário, se o nome de usuário for "root", executar algumas operações especiais.

Nota:No trecho de código2Se, no entanto, um usuário não fornecer o valor do campo de formulário "username", a string objeto userName será nula, não podendo comparar diretamente um objeto null com outro objeto, da mesma forma, o trecho de código2A página JSP correspondente lançará um erro de ponteiro nulo.

Um truque simples:Se precisar comparar o valor de retorno de um método com um constante, coloque a constante à frente para evitar a chamada do método equals de um objeto null. Por exemplo: 

If ("root".equals(userName)) 
  {....} 

Mesmo que o objeto userName retorne um objeto null, aqui não haverá exceção de ponteiro nulo e pode funcionar normalmente.

Trecho de código3:

String userName = session.getAttribute("session.username").toString(); 

Análise:Trecho de código3A função é extrair o valor de session.username da sessão e atribuir esse valor ao objeto de string userName.

Nota:Em geral, se o usuário já estiver em uma sessão, não haverá problemas; mas, se o servidor de aplicação reiniciar e o usuário ainda não se logar (pode ser que o usuário feche o navegador, mas continue abrindo a página original.), então o valor dessa sessão expirará, e o valor session.username na sessão ficará vazio. A execução direta de toString() em um objeto null causará a exceção de ponteiro nulo.

Trecho de código4:

public static void main(String args[]){ 
Person p=null; 
p.setName("张三"); 
System.out.println(p.getName()); 
} 

Análise:Declarar um objeto Person e imprimir o nome do objeto.

Nota:Neste momento, seu p lançará uma exceção de ponteiro nulo, porque você apenas declarou o objeto do tipo Person e não o criou, então não há referência de endereço na pilha. Preste atenção: ao chamar métodos do objeto, certifique-se de criar o objeto.

A: Começa a usar o objeto sem verificar se ele está vazio.

Trecho de código (JSP)1:

out.println(request.getParameter("username"));

Análise:Trecho de código1tem uma função muito simples, que é exibir o valor de entrada do usuário "username".

Nota:Parece que a frase acima não apresenta erros de sintaxe e, na maioria dos casos, não há problemas. Mas, se um usuário não fornecer o valor do campo "username" do formulário ou passar por algum meio para inserir diretamente, o valor de request.getParameter("username") será nulo (atenção: não é uma string vazia, é um objeto nulo null). Portanto, o método println do objeto out não pode operar diretamente sobre um objeto nulo, então o trecho de código1A página JSP em questão lançará a exceção "Java.lang.NullPointerException" e, mesmo que o objeto possa estar vazio, ele chama métodos como toString() e equal(Object obj) do Java.lang.Object ou do objeto Object em si.

Trecho de código (JSP)2:

String userName = request.getParameter("username");
  If (userName.equals("root"))
{....}

Análise:Trecho de código2A função é detectar o nome de usuário fornecido pelo usuário, se o nome de usuário for "root", executar algumas operações especiais.

Nota:No trecho de código2Se, no formulário, algum usuário não fornecer o valor do campo de formulário "username", o objeto de string userName será null, não será possível comparar diretamente um objeto null com outro objeto, igualmente, o trecho de código2A página JSP na qual o trecho de código está localizado lançará o erro (Java.lang.NullPointerException) de referência nula.

Trecho de código (JSP)3:

String userName = session.getAttribute
("session.username").toString();

Análise:Trecho de código3A função é extrair o valor de session.username da sessão e atribuir esse valor ao objeto de string userName.

Nota:Em geral, se o usuário já realizou uma sessão, não haverá problemas; mas, se o servidor de aplicativo reiniciar neste momento e o usuário ainda não se autenticar novamente (pode ser que o usuário feche o navegador, mas ainda abra a página original.) Então, o valor dessa sessão expirará e, ao mesmo tempo, o valor de session.username na sessão ficará vazio. A execução direta do método toString() em um objeto null diretamente causará a exceção (Java.lang.NullPointerException) de referência nula.

Isso é tudo o que o editor trouxe para você sobre uma breve discussão sobre a exceção de referência nula em java, esperamos que você dê mais apoio e gritos ao tutorial~

Você também pode gostar