Exceções [Resolvido]

5 respostas
C
Olá galerinha, Bom, estou aqui porque estou com um pequeno probleminha: Estou começando agora com Java mais avançado e nunca usei exceções. Atualmente estou desenvolvendo um sistema para a biblioteca da minha escola e na tela de cadastro de alunos existe um campo chamado "Matrícula" do tipo int. Aí, quando se digitava algo diferente de números, aparecia o seguinte erro:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "Num_matricula"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
        at java.lang.Integer.parseInt(Integer.java:449)
        at java.lang.Integer.parseInt(Integer.java:499)
        at biblioteca.model.Aluno.setMatricula(Aluno.java:101)
        at biblioteca.gui.Cadastro_aluno.cadastrarActionPerformed(Cadastro_aluno.java:229)
        at biblioteca.gui.Cadastro_aluno.access$100(Cadastro_aluno.java:6)
        at biblioteca.gui.Cadastro_aluno$2.actionPerformed(Cadastro_aluno.java:106)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6267)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6032)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Então, eu fiz um bloco Try-Catch do tipo NumberFormatException, para tratar essa exceção e até deu certo, mas...
Bom, primeiramente vejam a parte do meu código:

private void cadastrarActionPerformed(java.awt.event.ActionEvent evt) {                                          
    
    aluno.setNome( nome.getText() );

    try {
    aluno.setMatricula( matricula.getText() );
    }

    catch (NumberFormatException e){
    JOptionPane.showMessageDialog(null,"O campo matrícula deve conter apenas números!" );
    matricula.setText(null);
    }

    aluno.setCurso( curso.getText() );
    aluno.setSerie( serie.getText() );
    aluno.setEndereco( endereco.getText() );
    aluno.setStatus( status.getText() );
    aluno.setObservacao( observacao.getText() );
    JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso!");
    limpaDados();
   
    }
Bom, o que não está dando certo é que após a instrução
matricula.setText(null);
ser executada, o programa logo executa a instrução:
JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso!");
    limpaDados();

E desse jeito ele limpa o campo matrícula, mas não dá tempo de digitar da forma correta e logo aparece a mensagem "Cadastro realizado com sucesso!".

O que eu faço pra mensagem só aparecer depois que eu digitar novamente?

Me ajudem! :cry:

Obrigada desde já! :wink:

5 Respostas

nel

Bom dia Camila.

Exceções são fundamentais, saber trata-las é de suma importância no sistema afim de controlar possíveis erros.
Não vou me aprofundar em detalhes, mas recomendo a leitura do artigo do Sergio Taborda.

Sobre sua necessidade, é que você permite que mesmo com exceção o método continue com suas devidas ações.
Faça isso:

private void cadastrarActionPerformed(java.awt.event.ActionEvent evt) {                                             
       
    aluno.setNome( nome.getText() );   
    
    if( !matricula.getText().matches("\\d+")) {
       matricula.setText(null);   
       JOptionPane.showMessageDialog(null,"O campo matrícula deve conter apenas números!" );   
       return;
    }
    aluno.setMatricula( matricula.getText() );    
    aluno.setCurso( curso.getText() );   
    aluno.setSerie( serie.getText() );   
    aluno.setEndereco( endereco.getText() );   
    aluno.setStatus( status.getText() );   
    aluno.setObservacao( observacao.getText() );   
    JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso!");   
    limpaDados();   
     
}

Essa validação que eu fiz chama-se regex e é extremamente útil em muitos casos.
Perceba que eu adicionei um return; (já que é void o método) pois caso contrário, o método continuaria sendo executado normalmente.

C

[aaaaa] Muito obrigada!
Bom, não fiz do jeito que você colocou, só acrescentei o return; no final do bloco catch e funcionou do jeito que eu queria!

Me ajudou bastante, mais uma vez obrigada!

Vou ler o artigo que me recomendou!

A

faz o seguinte

private void cadastrarActionPerformed(java.awt.event.ActionEvent evt) {                                          
    try {
    aluno.setNome( nome.getText() );
     aluno.setMatricula( matricula.getText() );
    aluno.setCurso( curso.getText() );
    aluno.setSerie( serie.getText() );
    aluno.setEndereco( endereco.getText() );
    aluno.setStatus( status.getText() );
    aluno.setObservacao( observacao.getText() );
    JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso!");
    limpaDados();
   }

    catch (NumberFormatException e){
    JOptionPane.showMessageDialog(null,"O campo matrícula deve conter apenas números!" );
    matricula.setText(null);
    }
    }

t+

nel

CamilaBatista:
[aaaaa] Muito obrigada!
Bom, não fiz do jeito que você colocou, só acrescentei o return; no final do bloco catch e funcionou do jeito que eu queria!

Me ajudou bastante, mais uma vez obrigada!

Vou ler o artigo que me recomendou!

Show Camila :slight_smile:
Leia mesmo, é muito bom.

Apenas edite o seu tópico e adicione [Resolvido] ok ?
Abraços.

L

o seu problema pelo jeito ai esta sendo a hora que vc passa null para o setText(null), quando for int vc tem que passar algum numero nunca null.

Criado 22 de setembro de 2011
Ultima resposta 22 de set. de 2011
Respostas 5
Participantes 4