While

Boa tarde galera. Estou retornando ao Java e tenho uma duvida. A ideia é fazer com que o código para de rodar quando o usuário digitar “SAIR”. Eu não consigo fazer com que o código retorne de novo para dentro do WHILE. Na aula meu professor colocou um entrada=entrada.nextLine(); mas no JOptionPane não funciona assim. Poderiam me ajudar? Segue o código:

package controle;

import javax.swing.JOptionPane;

public class WhileIndeterminado {

public static void main(String[] args) {
	
	String entrada = JOptionPane.showInputDialog(
			"Digite algo / Digite 'SAIR' para sair.");
	entrada = entrada.toLowerCase();
	
	while (!entrada.equals("sair")){
	System.out.println(entrada);
	entrada = entrada;
	}
}

}

OBRIGADO!

Comparação com equals vai diferenciar letras maiúsculas de minúsculas. Ou vc compara com a palavra toda em maiúscula:

"SAIR".equals(entrada)

ou usa o método equalsIgnoreCase:

"sair".equalsIgnoreCase(entrada)

Então, esse não é o problema pq eu usei “entrada = entrada.toLowerCase();” para fazer essa função de igualar os caracteres, o problema é que não sei o que fazer para ele executar o WHILE e depois fazer a verificação novamente. Nesse meu codigo o WHILE ta dando loop infinito imprimindo a primeira coisa que é escrita no JOptionPane sem ser sair.

1 curtida

Eita, falha minha, nem reparei no lowercase.

As vezes a sua lógica ficaria melhor usando um do … while:

String entrada;

do {
  entrada = JOptionPane.showInputDialog("Digite algo / Digite 'SAIR' para sair.");
  entrada = entrada.toLowerCase();
  System.out.println(entrada);
} while (!entrada.equals("sair"));
1 curtida

Era a próxima aula. Ainda não tinha visto DO…WHILE. kkkkkkk sinceramente não era o que eu queria, mas vai servir, quem sabe um dia de bobeira não vem a ideia e eu consigo fazer usando só o WHILE, de qualquer forma muito obrigado pela ajuda!

Mas com o while também dá:

String entrada = "";

while (!entrada.equals("sair")) {
	entrada = JOptionPane.showInputDialog("Digite algo / Digite 'SAIR' para sair.");
	entrada = entrada.toLowerCase();
	System.out.println(entrada);
}
1 curtida

A solução seria então somente colocar o JOptionPane dentro do WHILE? Muito obrigado!

Isso. E declarar a variável entrada fora do while também, inicializada com uma string vazia ("").

1 curtida

Se vc não vai usar a variável entrada fora do while, pode declará-la dentro dele:

while (true) {
    String entrada = JOptionPane.showInputDialog("Digite algo / Digite 'SAIR' para sair.");
    // se digitar "sair", sai do while
    if ("sair".equalsIgnoreCase(entrada))
        break; // interrompe o while
    // se chegou aqui é porque não digitou "sair", então faz o que precisa com a entrada
    System.out.println(entrada);
}

Claro que se a variável entrada for usada depois do while (ou seja, fora dele), aí tem que declará-la fora também. Mas se ela só é usada ali dentro, pode optar por declará-la lá dentro mesmo. Eu prefiro assim porque limita o escopo da variável e deixa claro para qualquer um que ler o código que ela só deve existir ali dentro (fora do while ela não pode ser acessada).

Claro que as outras formas sugeridas também funcionam, mas eu pessoalmente não gosto desse jeito de inicializar a variável com um valor qualquer só para forçar que ela entre no loop. Por isso usei while(true) (um loop infinito) que só é interrompido por um break (que no caso, só é chamado se digitar “sair”).

Mas aí vai de cada um, tem gente que não gosta de break. Eu uso quando acho que faz sentido (e nesse caso acho que faz).

3 curtidas