Exceções [Resolvido]

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:

[code]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();

}[/code]

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:

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:

[code]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();   

} [/code]

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.

[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!

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+

[quote=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!
[/quote]

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

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

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.