Ajuda: como trato um erro de forma "amigável"?

Então pessoal,

o problema é o seguinte: digamos que em uma determinada parte do programa eu encontre um erro, um valor que o usuário entrou não pode ser convertido em inteiro, vamos supor, e a JVM para ali e lança uma exception, eu então coloco no catch daquela exception um joptionpane para avisar que o programa não pode executar aquela ação pois o número não foi convertido para intiero, isso me parece ser o casual… mas então, eu to precisando que, quando ocorra aquele erro e a jvm chame o catch adequando pra ele, q esse catch avise do erro e pergunte novamente ao usuário um valor e volte ao ponto que deu o erro atribuíndo o novo valor informado para esse… isso é possível?

Tem mais uma coisa: eu precisaria fazer esse catch em uma classe criada por mim que extenda de Exception… nesse código por exemplo:

public static void cadastrarCliente(Object object) { HashMap hashTmp = (HashMap)object; Cliente cliente; String value = JOptionPane.showInputDialog("Informe o nome do cliente:"); String nomeCliente = value; value = JOptionPane.showInputDialog("Informe o cpf do cliente:"); int cpfCliente; cpfCliente = Integer.parseInt(value); value = JOptionPane.showInputDialog("Informe o endereço do cliente:"); String endCliente = value; cliente = new Cliente(nomeCliente, cpfCliente, endCliente); hashTmp.put(String.valueOf(cliente.getCpfCliente()), cliente); JOptionPane.showMessageDialog(null, "Cliente cadastrado com sucesso!"); }
na hora que ele tenta converter de String para inteiro para atribuir o valor em cpfCliente, onde tem o Integer.parseInt(value);, digamos q ele não consiga fazer isso, eu teria um catch que lançaria esse erro para ser tratado em minha classe de erros, e apartir desse momento se eu quiser voltar a esse ponto c/ um novo valor em “value” para tentar converter, como poderia fazer isso?

Obrigado e um forte abraço.

Voltar não tem como não. Quer dizer, não sem uma estrutura de repetição. Tente fazer algo como:

[code]public int leInteiro(String questao) {
while(true) {
try {
String value = JOptionPane.showInputDialog(questao);

      if (value == null)
        return Integer.MIN_VALUE;

     return Integer.parseInt(value);
  } catch (NumberFormatException e) {
     JOptionPane.showMessageDialog("Por favor, informe um número válido!");
  }

}
}[/code]

[code]public static void cadastrarCliente(HashMap hashTmp) {
String nomeCliente = JOptionPane.showInputDialog(“Informe o nome do cliente:”);
int cpfCliente = leInteiro(“Informe o cpf do cliente:”);
if (cpfCliente == Integer.MIN_VALUE) {
JOptionPane.showMessageDialog(null, “Cadastro cancelado!”);
return;
}

String endCliente = JOptionPane.showInputDialog(“Informe o endereço do cliente:”);
Cliente cliente = new Cliente(nomeCliente, cpfCliente, endCliente);
hashTmp.put(String.valueOf(cliente.getCpfCliente()), cliente);
JOptionPane.showMessageDialog(null, “Cliente cadastrado com sucesso!”);
}[/code]

Mais algumas dicas:

Sempre declare variáveis o mais próximo possível de onde irá usa-las. Veja o caso da variável cliente, que no seu método foi declarada muito antes de ser inicializada.

Aquele cast de Object para HashMap está muito estranho. Pense um pouco e verá que há formas melhores de se evitar isso.

Muitas vezes pode ser uma boa idéia gravar o CPF como uma String e não como um número.

Aquela variável “value” que você usa para ler do JOptionPane simplesmente não é necessária.

Não use o HashMap diretamente. Ao invés disso, use-o através da classe Map. Clique aqui para saber o porquê.

A menos que você não possa usar o Java 5 ou superior, especifique o tipo do seu mapa. Esse mapa que você está usando mesmo deve ser declarado mais ou menos dessa forma:

Map<String, Cliente> clientesPorCpf = new HashMap<String, Cliente>();

Ao invés de usar vários JOptionPane, seria melhor você construir um JDialog com espaço para todos os campos. Coloque nesse JDialog um botão de salvar, cancelar, etc… e faça as devidas validações de uma vez só, sobre os dados digitados.

Vini, valeu mesmo pela ajuda kra, vou passar a utilizar todas as dicas :)!!
o código tá bem fraco mesmo, inclusive o jOptionPane eu gostaria de criar um programa todo em swing, mas foram limitações impostas pelo professor que não quer que os alunos usem nada que ele não deu em sala :-/ e isso inclui até o generics :-/!!!
mas vlw mesmo pela força…

Eu sei como é isso.

No Batalha Estelar eu tive que abrir mão de boa parte boa do C++ e da STL por causa disso. Nada de smart pointers, nada de uso da classe string e o professor ainda me criticou por usar const no lugar de defines, inline no lugar de macros, exceptions no lugar de códigos de retorno…

Em resumo, ele queria que programassemos em C usando classes, não em C++.