Desvio de fluxo (continue e break)

Boa tarde, no algoritmo abaixo, eu tenho que verificar se o CPF contém somente números. Ocorre que se eu digitar o CPF errado como por exemplo: 123K5678901, o algoritmo verificar que não contém somente número mas não volta a solicitá-lo novamente, pois é essa a intenção. No primeiro IF que onde se verifica que o CPF deve ter 11 dígitos, funcionou perfeitamente, ou seja, se eu digito um CPF com menos ou mais de 11 dígitos, o algoritmo solicita novamente até eu preencher corretamente a quantidade. Poderiam me ajudar?

import javax.swing.JOptionPane;

public class CPF {

	public static void main(String[] args) {

		String cpf = "";
		while (true) {
		
		cpf = JOptionPane.showInputDialog("Informe seu CPF");
		byte i=0;
		
		if (cpf == null || cpf.trim().length() == 0)System.exit(0);
		
		if (cpf.length() < 11 || cpf.length() > 11) { 
			JOptionPane.showMessageDialog(null, "CPF inválido");
			continue;
		}else {
			for (cpf.charAt(i); i<11; i++) {
				if ((byte)cpf.charAt(i) < 47 || (byte)cpf.charAt(i) > 58){
					JOptionPane.showMessageDialog(null, "Só pode ter números");
					continue;
				}
			}
		}

		break;
	}
		
	JOptionPane.showMessageDialog(null, cpf);
	System.exit(0);
		
	
	}
}

Eu não entendi o papel do while(true) e um break no final. Se vai quebrar na primeira execução, não precisa do while
Eu não entendi por que você tem um for

E, após a validação, um continue.

Você quer validar o CPF por algum algoritmo mais completo (ex: Validar CPF) ou só quer verificar se ele só possui números?

Um jeito simples é remover pontos e traços da String e tentar convertê-la pra Long. Se a conversão falhar, é porque há caracteres que não são numéricos. Ex:

public boolean validarCPF(String cpf){
  try{
    cpf = cpf.replaceAll('.', '').replaceAll('-', '');
    Long.parseLong(cpf);
    return true;
  }catch(Exception e){
      return false;
  }
}

Outras opções poderiam usar regex para ver se há caracteres não numéricos.

Abraço.

2 curtidas

Outro jeito de fazer:

String cpf = JOptionPane.showInputDialog("Informe seu CPF");
	
if (cpf == null || cpf.isEmpty()) {
    System.exit(0); //não recomendável
}
	
if (cpf.length() != 11) { 
    JOptionPane.showMessageDialog(null, "CPF inválido");
    return;
}

char[] digitos =  cpf.toCharArray();
for (char digito : digitos) {
    if (!Character.isDigit(digito)) {
        JOptionPane.showMessageDialog(null, "Só pode ter números");
        return;
    }
}

JOptionPane.showMessageDialog(null, cpf);
1 curtida

Excelente. Gostei dessa lógica. Obrigado.

Obrigado. No meu FOR a única maneira que pensei era varrendo carácter por carácter, o que deu certo, embora, assim como o algoritmo de conversão para long removendo pontos e traços deu certo, também achei muito bom esse seu jeito. Não sabia inclusive que poderia utilizar o FOR dessa maneira (ainda estou aprendendo).

Vou rever o conceito de CONTINUE e BREAK nesse final de semana. Pois a intenção é continuar a mostrar “Informe o CPF” enquanto não tiver 11 caracteres e enquanto não tiver somente números.

Eu até digito o CPF com uma letra por exemplo, ele me mostra a mensagem de erro, mas sai da estrutura de repetição WHILE, ou seja, o CONTINUE não funciona.

Obrigado.