Gostaria de saber se é possível reutilizar um bloco try-catch, (criar algo como um procedimento)…
Abaixo um esboço do código que lança uma exceção em caso de CPF inválido. O problema é que a leitura do CPF é feita em três métodos: cadastrar, excluir e alterar. Como poderia fazer para não repetir o mesmo código nos três métodos?
Ou um jeito melhor de fazer o que estou fazendo.
classeTelaCliente{cadastrarCliente(Empresaempresa){// ...outros dadosStringcpf="";for(;;){try{cpf=lerCpf("CPF - Apenas numeros: '[telefone removido]':");break;}catch(CpfInvalidoci){System.out.println(ci.getMessage());intopc=(int)lerNumero("Voce pode: \n"+"1) Informar o cpf novamente.\n"+"2) Sair.");if(opc==1)continue;else{System.out.println("Cadastro nao realizado.");return;}}}// resto do código}alterarCliente(Empresaempresa){// ...outros dadosStringcpf="";for(;;){try{cpf=lerCpf("CPF - Apenas numeros: '[telefone removido]':");break;}catch(CpfInvalidoci){System.out.println(ci.getMessage());intopc=(int)lerNumero("Voce pode: \n"+"1) Informar o cpf novamente.\n"+"2) Sair.");if(opc==1)continue;else{System.out.println("Cadastro nao realizado.");return;}}}// resto do código}excluirCliente(Empresaempresa){// ...outros dadosStringcpf="";for(;;){try{cpf=lerCpf("CPF - Apenas numeros: '[telefone removido]':");break;}catch(CpfInvalidoci){System.out.println(ci.getMessage());intopc=(int)lerNumero("Voce pode: \n"+"1) Informar o cpf novamente.\n"+"2) Sair.");if(opc==1)continue;else{System.out.println("Cadastro nao realizado.");return;}}}// resto do código}}
classeTela{
publicStringlerCpf (Stringrotulo) throwsCpfInvalido{
se (cpféválido)
returncpfsenaothrownewCpfInvalido();
}
}
bem na verdade a leitura do CPF é feita de uma forma só, dentro do metodo lerCpf();
sendo assim o q vc pode fazer é criar um metodo de leitura e validação do cpf e dentro do se CRUD
vc apenas fazer referencia a esse metodo
tipo assim:
privateStringlerCPF(){try{Stringcpf=lerCpf("CPF - Apenas numeros: '[telefone removido]':");returncpf;}catch(CpfInvalidoci){System.out.println(ci.getMessage());intopc=(int)lerNumero("Voce pode: \n"+"1) Informar o cpf novamente.\n"+"2) Sair.");if(opc==1)continue;else{System.out.println("Cadastro nao realizado.");return;}}}privatevoidcadastrar(){Stringcpf=lerCPF();...}privatevoidexcluir(){Stringcpf=lerCPF();...}privatevoidalterar(){Stringcpf=lerCPF();}
J
jhonatta
jeffepalmares:
bem na verdade a leitura do CPF é feita de uma forma só, dentro do metodo lerCpf();
sendo assim o q vc pode fazer é criar um metodo de leitura e validação do cpf e dentro do se CRUD
vc apenas fazer referencia a esse metodo
tipo assim:
privateStringlerCPF(){try{Stringcpf=lerCpf("CPF - Apenas numeros: '[telefone removido]':");returncpf;}catch(CpfInvalidoci){System.out.println(ci.getMessage());intopc=(int)lerNumero("Voce pode: \n"+"1) Informar o cpf novamente.\n"+"2) Sair.");if(opc==1)continue;else{System.out.println("Cadastro nao realizado.");return;}}}privatevoidcadastrar(){Stringcpf=lerCPF();...}privatevoidexcluir(){Stringcpf=lerCPF();...}privatevoidalterar(){Stringcpf=lerCPF();}
Obrigado pela resposta...
Ao chamar lerCpf espera-se o retorno de uma String. Minha intenção era, de alguma maneira, permitir ao usuário a opção de sair do método sem corrigir (neste caso não seria relizado o cadastro, alteração ou exclusão.) Acho que vou aproveitar sua idéia e retornar uma palavra especifica então caso o usuário não queira corrigir. Se a string for a palavra, não realiza o cadastro, se não for a palavra é um cpf e aí realiza o cadastro.
Lucas_Abbatepaolo
jeffepalmares:
bem na verdade a leitura do CPF é feita de uma forma só, dentro do metodo lerCpf();
sendo assim o q vc pode fazer é criar um metodo de leitura e validação do cpf e dentro do se CRUD
vc apenas fazer referencia a esse metodo
tipo assim:
privateStringlerCPF(){try{Stringcpf=lerCpf("CPF - Apenas numeros: '[telefone removido]':");returncpf;}catch(CpfInvalidoci){System.out.println(ci.getMessage());intopc=(int)lerNumero("Voce pode: \n"+"1) Informar o cpf novamente.\n"+"2) Sair.");if(opc==1)continue;else{System.out.println("Cadastro nao realizado.");return;}}}privatevoidcadastrar(){Stringcpf=lerCPF();...}privatevoidexcluir(){Stringcpf=lerCPF();...}privatevoidalterar(){Stringcpf=lerCPF();}
creio que desta forma ficaria melhor que a primeira forma
J
jhonatta
Lucas Abbatepaolo:
jeffepalmares:
bem na verdade a leitura do CPF é feita de uma forma só, dentro do metodo lerCpf();
sendo assim o q vc pode fazer é criar um metodo de leitura e validação do cpf e dentro do se CRUD
vc apenas fazer referencia a esse metodo
tipo assim:
privateStringlerCPF(){try{Stringcpf=lerCpf("CPF - Apenas numeros: '[telefone removido]':");returncpf;}catch(CpfInvalidoci){System.out.println(ci.getMessage());intopc=(int)lerNumero("Voce pode: \n"+"1) Informar o cpf novamente.\n"+"2) Sair.");if(opc==1)continue;else{System.out.println("Cadastro nao realizado.");return;}}}privatevoidcadastrar(){Stringcpf=lerCPF();...}privatevoidexcluir(){Stringcpf=lerCPF();...}privatevoidalterar(){Stringcpf=lerCPF();}
creio que desta forma ficaria melhor que a primeira forma
Sim, a idéia do jeffepalmares deu pra abrir a mente hehe. Ficou assim
publicStringlerCpf(Stringrotulo){System.out.println(rotulo);Scannerentrada=newScanner(System.in);Stringcpf=entrada.next();validacao=newValidacao();for(;;){if(!validacao.validarCpf(cpf)){System.out.println("CPF Invalido");System.out.println("Voce pode: \n"+"1) Informar o cpf novamente.\n"+"2) Sair.");if(entrada.nextInt()==1)cpf=entrada.next();elsereturn("invalida");}elsereturncpf;}}
ViniGodoy
Aproveite e já corrija os bugs e o estilo:
1. Você só deve usar o nextLine() para ler do console;
2. for ( ; ; ) é um estilo pobre. Hoje usa-se while (true).
3. Você também pode evitar muita identação se der o return antes.
4. Reduza o escopo das variáveis ao máximo, preferencialmente eliminando variáveis desnecessárias;
publicStringlerCpf(Stringrotulo){System.out.println(rotulo);while(true){Scannerin=newScanner(System.in);Stringcpf=in.nextLine();if(newValidacao().validarCpf(cpf)){returnplaca;}System.out.printf("CPF Invalido%n"+"Voce pode: %n%n"+"1) Informar o cpf novamente.%n"+"2) Sair.");if(!in.nextLine().equals("1"))return"";}}
Obrigado pelas sugestões…
Antes eu estava usando o nextLine como nesta sua linha
Stringcpf=newScanner(System.in).nextLine();
Mas ele retorna a String com quebra de linha, ai ficava algo assim na hora de entrar com os dados:
Nome: “entrada do usuario”
RG: “entrada do usuario”
CPF: “entrada do usuario”
Telefone: “entrada do usuario”
Endereco: “entrada do usuario”