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