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

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 :frowning:

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:

[code]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());}

[/code]

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

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
        }

Olá pode fazer o seguinte:

[code]boolean ok = false;

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

Vê se isso funciona.
Flw

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!

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!

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

        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 ?

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!

[quote=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![/quote]

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

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.

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!

Boa tarde nel!

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

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 ==================================================

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:

=\

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!!

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

[code]
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);[/code]

Nóis.

wellington.nogueira

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

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

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.

[quote=pmlm]Se tens um inteiro onde se usas 0 e 1 então deverias usar um boolean. [/quote]++

[quote=lleoaraujo]wellington.nogueira
Isso mesmo cara, fiz só um pouquinho diferente
não tinha visto sua resposta!
[=[/quote]
Legal que conseguiu, parabéns.