Como aceitar em maiúsculo ou minúsculo a resposta

galera tenho exercicio, professor pediu que ao receber a resposta deseja continuar: a resposta seja tanto com N ou n, sou nova e nao conseguindo desenrolar, alguem pode me ajuda? ja tente botar || dentro com ‘n’ mais nao fuciono.

abaixo segue parte do codigo

                  /resultado da diferença das horas trabalhadas/
        System.out.println(tempoFinal);
        System.out.printf("Valor a ser pago pelas horas Trabalhadas: R$ %.2f", valorPago);
        System.out.println();
        System.out.println("Deseja continuar (S/N)?");
        resp = ler.next().charAt(0);

             }catch (ParseException e) {
                  e.printStackTrace();

        Entrada.close();
    }

              }while (resp != 'N');{
                      System.out.println("Obrigado por usar o Registro de Horas de Trabalho em Java!");
        }
   }

}

Uma forma de fazer é usar break para interromper o loop, e em vez de pegar o primeiro caractere, compare a própria String com equalsIgnoreCase:

while (true) {
    // faz o que precisa

    // pergunta se quer continuar
    System.out.println("Deseja continuar (S/N)?");
    if ("N".equalsIgnoreCase(ler.nextLine())) {
        break; // interrompe o while
    }
}

A única desvantagem é que se vc digitar qualquer coisa diferente de “N” ou “n”, ele prossegue (mesmo se digitar algo sem sentido, como “abc”, ou seja, nem precisa digitar “S” para continuar).


Se quiser ser um pouco mais rígido (aceita apenas “S” ou “N”), dá pra fazer com outro loop interno só para ler a opção:

principal: while (true) { // "principal" é um label para este loop
    // loop principal, onde vc faz o que precisa

    // parte que pergunta se quer continuar
    // este loop é para ler a opção "deseja continuar"
    // se não digitar uma opção válida, pede pra digitar novamente
    while (true) {
        System.out.println("Deseja continuar (S/N)?");
        String opcao = ler.nextLine();
        if ("N".equalsIgnoreCase(opcao)) {
            break principal; // não quer continuar, sai do loop principal
        } else if ("S".equalsIgnoreCase(opcao)) {
            break; // quer continuar, só sai desse loop interno, mas continua o principal
        } else {
            // opção inválida, pede para digitar de novo
            System.out.println("Digite apenas 'S' ou 'N'");
        }
    }
}

Também adicionei o label principal no loop externo, assim fica mais fácil interrompê-lo quando digitar “N”.

2 curtidas

nossa Hugo muito obrigada, voce e demais. :smiling_face_with_three_hearts:

principal nesse caso é um var? Tô por fora das novidades do java

Isso é um label, existe desde sempre pelo que me lembro. Basicamente, vc dá um “nome” para o loop, e aí no break ou continue, pode indicar que se refere àquele loop específico:

externo: for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        if (algumaCondicao) {
            break; // interrompe o segundo for
        } else if (outraCondicao) {
            // interrompe o primeiro for (pois o label "externo" refere-se a ele)
            break externo;
        }
    }
}

Achei referência a isso na especificação do Java 6, que foi a mais antiga que encontrei (dezembro de 2006). Mas lembro de já existir em versões anteriores.

É algo que usei raríssimas vezes, e pelo que vejo, a maioria também não usa. É um daqueles recursos “exóticos” e pouco conhecidos (como poder criar classe dentro de método), que as pessoas acabam resolvendo de outras maneiras.

1 curtida

Sim, acho que sempre existiu. O pior é ter professor que insiste em ensinar esse tipo de desvio. É quase um goto.