Catch ( Exception e) {}

6 respostas
T

Tenho esse try, queria saber como que faço pra tratar um eventual erro, usando a Exception, mas quando houver esse erro o cursor voltar para codAlunofield(jtextField) pra o usuario digite novamente!! Alguem pode me ajudar???

try {

queryAluno = entityManager.createNamedQuery(Aluno.findByCodaluno);

queryAluno.setParameter(codaluno, Integer.parseInt(codAlunofield.getText()));

listAluno = queryAluno.getResultList();

nomeAlunoField.setText(listAluno.get(0).getNome());

cpfAlunoField.setText(listAluno.get(0).getCpf());

} catch ( Exception e) {

JOptionPane.showMessageDialog(null, Ocorreu um erro, use apenas numeros!);

e.printStackTrace();

codAlunofield.requestFocus();

}

6 Respostas

R

É mais simples vc usar uma máscara para números no input que vc deseja.

T

Tambem pensei nisso, mas tem a possibilidade o usuario digitar um codigo que nao existe!!!

Rafael_Guerreiro

Bom… Primeira coisa, faça o catch em NumberFormatException, já que ela foi feita para saber quando um valor não pode ser convertido em número.

Já ao caso de um registro não existente, lance uma IllegalStateException caso a variavel ‘listAluno’ esteja null. Depois capture essa exception e envie uma mensagem correta para esse erro.

Por fim, faça um catch em Exception para casos mais genéricos e, se algum dia cair lá, pegue a exception e faça um catch só para ela.

mateusviccari

pra fazer o “cursor” voltar em m determinado campo(na verdade o nome disso se chama transferencia de foco) voce usa o método nomeDoCampo.requestFocusInWindow();

gomesrod

É melhor refinar um pouco esse tratamento. Do jeito que está ele vai dar a mensagem de “Digite apenas números” para qualquer coisa errada que aconteça, desde formato incorreto do número a aluno não encontrado, ou até mesmo erro de conexão com banco de dados!

Era sobre isso que o Rafael Guerreiro estava falando no comentário dele.

Tem vários jeitos de fazer isso:

int codAluno;
try {
    codAluno = Integer.parseInt(codAlunofield.getText());
} catch (NumberFormatException nfe) {
    // Esse catch esta tratando especificamente erros no formato do dado.
    JOptionPane.showMessageDialog(null, "Dado inválido, use apenas numeros!");
    // Não precisa gravar em log ou dar printStackTrace porque é apenas um erro de validação, uma situação normal!
    codAlunofield.requestFocusInWindow(); // Aqui ja testando a solução sugerida para o problema do foco no campo.
    return;
}

try {
queryAluno = entityManager.createNamedQuery("Aluno.findByCodaluno");
queryAluno.setParameter("codaluno", );
listAluno = queryAluno.getResultList();
} catch (Exception e) {
    // Aqui sim realmente deu pau da aplicacao! É erro na consulta ao banco de dados. Nem precisa voltar ao campo porque nao é erro de preenchimento
    e.printStackTrace();
    JOptionPane.showMessageDialog(null, "Ocorreu um erro na consulta de alunos. Desculpe :-( ");
    return;
}

// Agora uma validaçao que estava faltando. Sera que a pesquisa trouxe algum aluno?
if (listAluno.isEmpty()) {
    JOptionPane.showMessageDialog(null, "Código invalido, nenhum aluno encontrado");
    codAlunofield.requestFocusInWindow();
    return;
}

// Todas as validacoes foram feitas, esse trecho é seguro.
nomeAlunoField.setText(listAluno.get(0).getNome());
cpfAlunoField.setText(listAluno.get(0).getCpf());

Esse outro jeiro tem menos código, mas a lógica não fica tão clara e tem alguns maus hábitos aí no meio (como usar IndexOutOfBoundsException como fluxo normal do programa):

try { queryAluno = entityManager.createNamedQuery("Aluno.findByCodaluno"); queryAluno.setParameter("codaluno", Integer.parseInt(codAlunofield.getText())); listAluno = queryAluno.getResultList(); nomeAlunoField.setText(listAluno.get(0).getNome()); cpfAlunoField.setText(listAluno.get(0).getCpf()); } catch (NumberFormatException e) { // Vai cair nessa exceção quando o número for inválido. JOptionPane.showMessageDialog(null, "Código inválido, use apenas numeros!"); codAlunofield.requestFocusInWindow(); } catch (IndexOutOfBoundsException e) { // Vai cair nessa exceção quando nao existir elementos na lista. É feio usar essa exceção como parte do fluxo normal, o melhor é testar antes de fazer get(). JOptionPane.showMessageDialog(null, "Código inválido, não existe aluno com esse código"); codAlunofield.requestFocusInWindow(); } catch ( Exception e) { // Se cair aqui é porque deu pau e.printStackTrace(); JOptionPane.showMessageDialog(null, "Ocorreu um erro na consulta de alunos. Desculpe :-( "); return; }

E outra maneira, que é a mais indicada ao desenvolver aplicações reais (que poderão vir a evoluir), é separar as regras de negócio em uma outra camada independente da interface de usuário. Essa maneira eu deixo a seu critério porque já escrevi demais rs

T

o cod funcionou, mas quando da uma exception sempre aparece duas janelas " Ocorreu um erro, use apenas numeros" ai depois vem o erro citado no codigo " , “Ocorreu um erro na consulta de alunos. Desculpe :-(”.

Criado 8 de novembro de 2012
Ultima resposta 9 de nov. de 2012
Respostas 6
Participantes 5