Laços de repetição - do-while dentro de do-while

Estou tentando criar um laço onde ele pergunte se desero repetir a operação, então coloquei tudo dentro de um do-while e no final pergunta se desejo repetir toda operação. Mas não ta indo. Alguém poderia dar um help?

Segue código:

public class Repeticao {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
boolean validar = false;
boolean repetir = false;
String repita;

    int a, b;
    
    do{
        validar = false;
        do{
            System.out.println("Informe valor de A");
            a = scan.nextInt();
            if (a < 0){
                System.out.println("O numero deve ser maior do que zero - digite novamente");
            }else{
                validar = true;
            }
        }while(!validar);
        
        validar = false;
        do{
            System.out.println("Informe valor de B");
            b = scan.nextInt();
            if (b < 0){
                System.out.println("O numero deve ser maior do que zero - digite novamente");
            }else{
                validar = true;
            }
        }while(!validar);
        
        System.out.println("A = " + a);
        System.out.println("B = " + b);
        System.out.println("Soma dos numeros = " + (a + b));
        
        System.out.println("Deseja repetir? 's' ou 'n' ");    
        repita = scan.nextLine();
        if (repita.equalsIgnoreCase("s")){
            repetir = false;
        }else{
            repetir = true;
        }
        
    }while(!repetir);
}

}

Vc está misturando nextInt() com nextLine()… Para ter menos “problemas”, leia tudo usando nextLine() e converta para os tipos apropriados.

int a;
double b;
String c;
a = Integer.parseInt( scan.nextLine() );
b = Double.parseDouble( scan.nextLine() );
c = scan.nextLine();
1 curtida

nextLine é para ler String, nextInt é para ler numeros inteiros. Mesmo que eu siga a tua dica, não é isso que está atrapalhando. A questão é que o comando de repetição do-while dentro de do-while não está funcionano. E eu gostaria de saber o porque.

Me parece que por algum motivo no final do código ele não está seguindo a sequencia de comandos após a última mensagem de texto e está encerrando o laço.

deu certo o teu jeito. Obrigado. Mas porque do outro jeito deu errado?

Realmente era isso mesmo o que estava atrapalhando, esses detalhe do java realmente são coisas que só se descobre na prática mesmo. Parece que nem sempre as coisas funcionam dentro do padrão que está no manual. Obrigado professor!

O nextInt(), next(),... não lêem o enter que colocas para submeter o resultado. O nextLine() vai ver que está o enter no buffer e lê imediatamente, não esperando pelo teu input.
Para ler dados de input do utilizador, usa sempre o nextLine() para leres todo o input (incluindo o enter) e não deixares lixo que vá ser lido a seguir por outro método sem te aperceberes.

Essa frase é muito bonita, mas não se aplica quando o Scanner é usado para ler a partir do TECLADO.

Quando você usa o Scanner para ler do TECLADO, utilize somente nextLine().
O nextLine() é o único método do Scanner que consome a quebra de linha gerada ao pressionar ENTER.

Quando você está lendo do TECLADO e faz um nextInt(), a quebra de linha fica “pendurada” na memória do Scanner, se após um nextInt() você fizer um nextLine(), ele não vai ler uma entrada de texto, ele vai ler primeiro aquela quebra de linha que ficou pendurada quando você fez o nextInt().

Isso é válido pra todos os métodos do Scanner, o único método que consome a quebra de linha do TECLADO é o nextLine().

1 curtida

Bom, já explicaram porque não funcionava, mas em todo o caso sugiro que leia aqui para entender melhor

Alguns colegas já explicaram acima.
O mesmo acontece em várias linguagens de programação e sim, está descrito na API.

Abraço!

1 curtida

Obrigado pelas respostas todas. Aprendi bem essa questão. Muito bom esse fórum!