Problemas com loop em Try/Catch - Exceção

19 respostas
lleoaraujo

Olá amigos,
Estou com um problema que não consigo resolver de jeito nenhum, por isso vim aqui!
Acho que ele é até simples, mas não tá saindo :(

Na hora que lanço uma exceção, gostaria que o programa não parasse (quando é digitado um valor inválido). Quando fosse inserido algo que a exceção pegue, ele volta com uma mensagem pedindo para o usuário digitar novamente.. A questão é que já tentei colocar vários loops, e tudo sem sucesso.
Se alguem puder me ajudar, por favor, aprender na raça é teeenso!
Desde já agradeço!

Aqui está a parte do código, que me refiro:

public static void cadastrarPessoa() throws CPFInvalidoException{
	     
		int opcao;
		do{
			System.out.print("Deseja cadastrar uma pessoa do tipo Fisica ou Juridica(Digite 1 para Fisica e 2 para Juridica)? ");
			opcao = Integer.parseInt(scan.nextLine());
		}while(opcao!=1&&opcao!=2);
		
		if(opcao==1){
		
		  PessoaFisica pessoa = new PessoaFisica();
		
		  try {
	      System.out.print(PROMPT_NOME);
	      pessoa.setNome(scan.nextLine());
		  } catch(IllegalArgumentException e) {
			  System.out.print("O seguinte erro ocorreu: "+e.getMessage());
		  }
	      
		  /*
		   * Bloco que serve para tratar a exceção do cpf
		   */
	      try {
	    	  System.out.print(PROMPT_CPF);
	    	  pessoa.setCpf(scan.nextLine());
		  } catch (CPFInvalidoException e) {
				System.out.print("Seguinte erro ocorreu: "+e.getMessage());}

O cpf está validado da maneira que queria, só preciso mesmo é colocar um loop pra ele ver o erro, e aparecer "digite novamente o cpf"
Tentei colocar um 'boolean testa = true', mas sem sucesso.
Alguem poderia me dar uma luz?

Desde já agradeço.
é nois

19 Respostas

romarcio

A mensagem vc pode por dentro do catch.

E para não parar vc precisa criar um finally.

try {
            System.out.print(PROMPT_CPF);
            pessoa.setCpf(scan.nextLine());
        } catch (CPFInvalidoException e) {
            JOptionPane.showMessageDialog(null, "Ocorre um erro tente novamente");
            System.out.print("Seguinte erro ocorreu: " + e.getMessage());
        } finally {
            //aqui o código que seja continuar executando
        }
Frantic_Avenger

Olá pode fazer o seguinte:

boolean ok = false;

     while (!ok){
          try{
               ...
               ok = true; //última linha do try;
          } catch (Exception e){
              System.out.println(e);
          }
     }

Vê se isso funciona.
Flw

lleoaraujo

Opa, valeu romarcio!

Mas infelizmente, não funcionou…

Coloquei aqui, e ele ainda não retorna a mensagem quando é colocado algo inválido.

E abaixo dessa parte do código, ele pergunta outros atributos…
Aí onde eu fecho esse finally?

Valeu!

lleoaraujo

Frantic Avenger

A questão do boolean resolveu em partes!
Ele valida, e informa o erro, mas não volta pro usuário digitar a mensagem, ele continua executando o código com o cpf errado…
Mais alguma sugestão?

Valeu demais cara, ta saindo aqui!

T

Coloca a captura do dado dentro do while.
Segue o exemplo do “Frantic Avenger” e coloca a captura em seguida a validação depois ajusta a variavel para true, caso a validação seja OK, vc continua caso gere a exceção ele volta no while novamente

romarcio
if (opcao == 1) {

            Pessoa pessoa = new Pessoa();

            while (pessoa.getNome() == null || pessoa.getNome().equals("")) {
                try {
                    System.out.print(PROMPT_NOME);
	                pessoa.setNome(scan.nextLine());
                } catch (IllegalArgumentException e) {
                    JOptionPane.showMessageDialog(null, "O seguinte erro ocorreu: " + e.getMessage() + "\nTente Novamente");
                }
            }

            while (pessoa.getCpf() == null || pessoa.getCpf.equals("")) {
                try {
                    System.out.print(PROMPT_CPF);
	    	        pessoa.setCpf(scan.nextLine());
                } catch (IllegalArgumentException e) {
                    JOptionPane.showMessageDialog(null, "O seguinte erro ocorreu: " + e.getMessage() + "\nTente Novamente");
                }
            }

        }

Seria algo do tipo ?

lleoaraujo

Romarcio,

Com isso, ele valida, tudo certinho… Mas não volta!

Informe o CPF: 221 Exception in thread "main" java.lang.IllegalArgumentException: CPF invalido at PessoaFisica.setCpf(PessoaFisica.java:85) at Teste.cadastrarPessoa(Teste.java:154) at Teste.main(Teste.java:77)

Oque estou tentando fazer, é com que se digitarem errado, ele pede pra digitar novamente, aí quando for um algo válido, ele continue…

Valeu!

romarcio

lleoaraujo:
Romarcio,

Com isso, ele valida, tudo certinho… Mas não volta!

Informe o CPF: 221 Exception in thread "main" java.lang.IllegalArgumentException: CPF invalido at PessoaFisica.setCpf(PessoaFisica.java:85) at Teste.cadastrarPessoa(Teste.java:154) at Teste.main(Teste.java:77)

Oque estou tentando fazer, é com que se digitarem errado, ele pede pra digitar novamente, aí quando for um algo válido, ele continue…

Valeu!

Era para ele continuar no While quando vc digita errado.
O que extamente vc está validando no CPF?

nel

Boa tarde.

Não visualizei esta mensagem " CPF invalido " em nenhuma excessão, devo estar com problema de vista ou não foi postado mesmo.
Pode postar o código completo para analisarmos?

Abraços.

lleoaraujo

Estou validando, o próprio número digitado.

Se não for um número com tantos digitos, e tais parametros, ele relata erro…
Quando eu coloco um cpf certo, ele não acusa nada e continua cadastrando.
O problema tá quando eu coloco algum errado.
Era pra ele perguntar, e continuar no while…
Não sei oque acontece! Diabos!

lleoaraujo

Boa tarde nel!

Posso sim, mas o código é meio extenso!
tem algum problema?

T

Por que então ao invés do seu validador gerar uma execessão ele não retorna somente um true ou false para seu while, desta forma você gera o loop e utiliza o seu validador como condição.

Eu fiz isto na minha aplicação… Segue o código abaixo.

(diga de passagem peguei o codigo aqui no forum)…

public boolean calculaCPF(String cpfNum) {
		int[] cpf = new int[cpfNum.length()]; // define o valor com o tamanho da
		// string
		int resultP = 0;
		int resultS = 0;

		if (cpfNum.length() < 9) {
			return false;
		}
		try{
		// converte a string para um array de integer
		for (int i = 0; i < cpf.length; i++) {
			cpf[i] = Integer.parseInt(cpfNum.substring(i, i + 1));
		}
		}catch(NumberFormatException e){
			e.printStackTrace();
			return false;
		}
		// calcula o primeiro nmero(DIV) do cpf
		for (int i = 0; i < 9; i++) {
			resultP += cpf[i] * (i + 1);
		}
		int divP = resultP % 11;

		// se o resultado for diferente ao 10 digito do cpf retorna falso
		if (divP != cpf[9]) {
			return false;
		} else {
			// calcula o segundo nmero(DIV) do cpf
			for (int i = 0; i < 10; i++) {
				resultS += cpf[i] * (i);
			}
			int divS = resultS % 11;

			// se o resultado for diferente ao 11 digito do cpf retorna falso
			if (divS != cpf[10]) {
				return false;
			}
		}

		// se tudo estiver ok retorna verdadeiro
		return true;
	}// fim do calcular cpf ==================================================

	public boolean calculaCNPJ(String cnpjNum) {
		int[] cnpj = new int[cnpjNum.length()];
		int resultP = 0;
		int resultS = 0;
		int divP = 0;
		int divS = 0;

		if (cnpjNum.length() < 14) {
			return false;
		}
		try {
			// converte string para um array de integer
			for (int i = 0; i < cnpjNum.length(); i++) {
				cnpj[i] = Integer.parseInt(cnpjNum.substring(i, i + 1));
			}
		} catch (NumberFormatException e) {
			e.printStackTrace();
			return false;
		}
		int j = 6;
		// calcula o primeiro div
		for (int i = 0; i < 12; i++) {
			resultP += cnpj[i] * j;

			j++;
			if (j > 9) {
				j = 2;
			}
		}
		divP = resultP % 11;

		if (divP != cnpj[12]) {
			return false;
		} else {
			j = 5;
			// calcula o segundo div
			for (int i = 0; i < 13; i++) {
				resultS += cnpj[i] * j;

				j++;
				if (j > 9) {
					j = 2;
				}
			}
			divS = resultS % 11;

			if (divS != cnpj[13])
				return false;
		}
		return true;
	}// fim do calcular CNPJ ==================================================
lleoaraujo

Cara, deste jeito funciona direitinho…

A questão é que ele valida, mas o meu intuito era de retornar uma mensagem pro usuário, falando do erro, e pedindo o valor correto desta vez…

E é isso que não consigo de jeito nenhum. :evil:

=\

nel

Mesmo sendo extenso, não há problema.
Não precisa postar todas as tuas classes, poste a que você efetua a validação do CPF, esta sim, faça o post completo do código :slight_smile:

Abraços!!

lleoaraujo

Diga manos!
Consegui! :D
Valeu, sem a ajuda de voces não ia conseguir nem fod319-**s

String cpf; int valida;
	      do{
	    	  System.out.print(PROMPT_CPF); // "Informe o cpf :"
	    	  cpf = scan.nextLine();
	    	  if(Validacao.validaCPF(cpf)){ // chama o método da validação
	    		  pessoa.setCpf(cpf);
	    		  valida=1;}
	    	  else{
	    		  System.out.print("CPF invalido, tente novamente.\n");
	    		  valida=0;
	    	  }
	    	  
	    		
	      }while(valida==0);

Nóis.

lleoaraujo

wellington.nogueira

Isso mesmo cara, fiz só um pouquinho diferente
não tinha visto sua resposta!
[=

pmlm

Se tens um inteiro onde se usas 0 e 1 então deverias usar um boolean.

WellingtonRamos

Provavelmente seu setCPF está fazendo algo do tipo:

public void setCPF(int cpf){ this.cpf = cpf; validaCPF(cpf); }
Inverta:

public void setCPF(int cpf){ validaCPF(cpf); this.cpf = cpf; }

Entretanto eu vejo validação por exceção como uma má prática, especialmente se você pode ter o controle.
É melhor fazer um controle assim:

do{ boolean cpfValido = setCPF(valor); if(!cpfValido){ System.out.println("Valor errado. Informe novamente"); } } while(!cpfValido);

PS: Omiti propositalmente parte do código onde obtêm-se o valor.

WellingtonRamos

pmlm:
Se tens um inteiro onde se usas 0 e 1 então deverias usar um boolean.
++

lleoaraujo:
wellington.nogueira
Isso mesmo cara, fiz só um pouquinho diferente
não tinha visto sua resposta!
[=

Legal que conseguiu, parabéns.

Criado 26 de agosto de 2010
Ultima resposta 27 de ago. de 2010
Respostas 19
Participantes 7