While não funciona

Pessoal, boa noite. Eu tenho dois algoritmos muito parecidos abaixo. O primeiro funciona, já o segundo não. Fiz somente uma modificação no segundo algoritmo na instrução while mas não entendi porque ele não continua dentro do while mesmo a instrução continuando como verdadeira (pelo menos eu acho que está retornando true):

Algoritmo 1:

Blockquote

import javax.swing.JOptionPane;

public class Algoritmo1{

public static void main(String[] args) {

	boolean nome_valido = false;
	String n = "";
	
	while(nome_valido == false) {
		
		n = JOptionPane.showInputDialog("Informe seu nome");
	
		if (n == null)System.exit(0);
		
		if (n.length() < 5 || n.length() > 50) {
			JOptionPane.showMessageDialog(null, "Nome inválido");
		}else if (	
			n.contains("0") |
			n.contains("1") |
			n.contains("2") |
			n.contains("3") |
			n.contains("4") |
			n.contains("5") |
			n.contains("6") |
			n.contains("7") |
			n.contains("8") |
			n.contains("9")) {
				JOptionPane.showMessageDialog(null, "Não pode ter número");
			}
			else nome_valido = true;

	}
	
	JOptionPane.showMessageDialog(null, "Nome válido: " + n);
	System.exit(0);

}

}

Blockquote

Algoritmo 2:

Blockquote

import javax.swing.JOptionPane;

public class C0811Teste {

public static void main(String[] args) {

	String n = "";
	
	while(n == "" || n == null) {
		
		n = JOptionPane.showInputDialog("Informe seu nome");
	
		if (n == null)System.exit(0);
		
		if (n.length() < 5 || n.length() > 50) {
			JOptionPane.showMessageDialog(null, "Nome inválido");
		}else if (	
			n.contains("0") |
			n.contains("1") |
			n.contains("2") |
			n.contains("3") |
			n.contains("4") |
			n.contains("5") |
			n.contains("6") |
			n.contains("7") |
			n.contains("8") |
			n.contains("9")) {
				JOptionPane.showMessageDialog(null, "Não pode ter número");
			}
	}
	
	JOptionPane.showMessageDialog(null, "Nome válido: " + n);
	System.exit(0);

}

}

Blockquote

Ao deixar em branco o nome, somente pressionando o OK, eu não fico dentro do while até ter um nome válido.

Obrigado.

Ola C4sh3w, tudo bem?
Note que no primeiro codigo vc colocou um “else nome_valido = true;” apos o if que vc verifica se o nome tem algum numero.
No segundo falta algo parecido, ex: “else n = null”.
Isso resolveria seu problema em parte.

notei alguns itens que merece ser destacado:
1-no primeiro codigo vc tem:

 while(nome_valido == false){
//codigo
}

Funciona?
Sim, mas valos intender: o while recebe como parametro um booleano, assim se vc colocar

while(nome_valido){
//codigo
}

o codigo dentro das chaves sera executado enquanto nome_valido ter o valor true. No caso do seu codigo é necessario executar sempre q for falso para isso usa-se o operador de negação de booleano “!”, então seu codigo ficaria

while(!nome_valido){
//codigo
}

2-No seu segundo codigo vc faz 2 coisas equivocadas no trexo

while(n == "" || n = null){
//codigo
}

Primeiro foi fazer o teste dessa forma

n == "" 

(isso não funciona), a String e todos os objetos que extende de Object(ou seja todos) tem um metodo chamado

obj1.equals(Object ob);

Esse metodo testa se “obj1” é igual a “ob”, na string isso ira testar se todos os caracteres são iguais nas duas strings. A segunda coisa seria primeiro vc testar se a variavel esta vazia

 n.equals("")

e depois verificar se ela esta null

n == null

fazendo assim se n estiver null quando executar “e.equals(”")" ira gerar um NullPointExeption.
Então faça Assim:

if(n == null || n.equals("")){
//codigo
}

Se vc quiser aprender mais sobre Progração se inscreva em meu canal Sistemas Robustos: https://www.youtube.com/channel/UClQejqkQNTb0nNZ6gv-vFFw

Estarei postando videos sobre programação semanalmente.

1 curtida

while(!nome_valido) {

Aliás, que nome de variável é esse? por que não usa o padrão javaBeans e corrige para nomeValido?

1 curtida

Boas práticas de programação, sempre bom lembrar. Excelente dica.