É 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