Reutilização de blocos Try Catch - Exceções

7 respostas
J

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.

classe TelaCliente{

 cadastrarCliente(Empresa empresa){
	// ...outros dados
        String cpf ="";
        for (;;){
            try{
                cpf = lerCpf("CPF - Apenas numeros: '[telefone removido]':");
                break;
            }catch (CpfInvalido ci){
                System.out.println(ci.getMessage());
                int opc = (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(Empresa empresa){
	// ...outros dados
        String cpf ="";
        for (;;){
            try{
                cpf = lerCpf("CPF - Apenas numeros: '[telefone removido]':");
                break;
            }catch (CpfInvalido ci){
                System.out.println(ci.getMessage());
                int opc = (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(Empresa empresa){
	// ...outros dados
        String cpf ="";
        for (;;){
            try{
                cpf = lerCpf("CPF - Apenas numeros: '[telefone removido]':");
                break;
            }catch (CpfInvalido ci){
                System.out.println(ci.getMessage());
                int opc = (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
 }

}
classe Tela{
    public String lerCpf (String rotulo) throws CpfInvalido{
	se (cpf é válido)
	    return cpf
        senao
            throw new CpfInvalido();
    }
}

7 Respostas

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:

private String lerCPF(){
            try{
               
                String   cpf = lerCpf("CPF - Apenas numeros: '[telefone removido]':");  
                return cpf;

            }catch (CpfInvalido ci){  
                System.out.println(ci.getMessage());  
                int opc = (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;  
                }  
            }  
       }               
            

private void cadastrar(){
String cpf = lerCPF();
...
}
private void excluir(){
String cpf = lerCPF();
...
}
private void alterar(){
String cpf = lerCPF();
}
J
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:
private String lerCPF(){
            try{
               
                String   cpf = lerCpf("CPF - Apenas numeros: '[telefone removido]':");  
                return cpf;

            }catch (CpfInvalido ci){  
                System.out.println(ci.getMessage());  
                int opc = (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;  
                }  
            }  
       }               
            

private void cadastrar(){
String cpf = lerCPF();
...
}
private void excluir(){
String cpf = lerCPF();
...
}
private void alterar(){
String cpf = 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:
private String lerCPF(){
            try{
               
                String   cpf = lerCpf("CPF - Apenas numeros: '[telefone removido]':");  
                return cpf;

            }catch (CpfInvalido ci){  
                System.out.println(ci.getMessage());  
                int opc = (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;  
                }  
            }  
       }               
            

private void cadastrar(){
String cpf = lerCPF();
...
}
private void excluir(){
String cpf = lerCPF();
...
}
private void alterar(){
String cpf = lerCPF();
}

creio que desta forma ficaria melhor que a primeira forma

J
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:
private String lerCPF(){
            try{
               
                String   cpf = lerCpf("CPF - Apenas numeros: '[telefone removido]':");  
                return cpf;

            }catch (CpfInvalido ci){  
                System.out.println(ci.getMessage());  
                int opc = (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;  
                }  
            }  
       }               
            

private void cadastrar(){
String cpf = lerCPF();
...
}
private void excluir(){
String cpf = lerCPF();
...
}
private void alterar(){
String cpf = 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

public String lerCpf (String rotulo){
        System.out.println(rotulo);
        Scanner entrada = new Scanner(System.in);
        String cpf = entrada.next();
        validacao = new Validacao();
        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();
                else
                    return ("invalida");
            }else
                return cpf;
        }
    }
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;

public String lerCpf(String rotulo){
        System.out.println(rotulo);        
        while (true) {
            Scanner in = new Scanner(System.in);            
            String cpf = in.nextLine();
            if (new Validacao().validarCpf(cpf)){
                return placa;
            }  
      
            System.out.printf("CPF Invalido%n" +
                 "Voce pode: %n%n" +
                "1) Informar o cpf novamente.%n" +
                "2) Sair.");

            if (!in.nextLine().equals("1"))
                return ""; 
        }
    }
Fora do método, você faz assim:
String cpf = lerCpf();
if (cpf.isEmpty()) //Decidiu não informar o cpf
{
}
ViniGodoy

Porque não usar método diferente do nextLine(): http://www.guj.com.br/java/212604-resolvido-uso-da-classe-scanner#1082242

J

ViniGodoy:
Porque não usar método diferente do nextLine(): http://www.guj.com.br/java/212604-resolvido-uso-da-classe-scanner#1082242

Obrigado pelas sugestões…
Antes eu estava usando o nextLine como nesta sua linha

String cpf = new Scanner(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”

Criado 2 de dezembro de 2011
Ultima resposta 2 de dez. de 2011
Respostas 7
Participantes 4