Classe Scanner (nextLine) em um loop

Amigos, quando uso o método nextLine() da classe Scanner em um loop tipo while acontece um problema A PARTIR DA SEGUNDA ITERAÇÃO (segunda entrada no laço while): ao invés de surgir na tela a 1ª solicitação (“Digite seu nome”) aparecem as 2 ao mesmo tempo, uma em baixo da outra. Assim:Digite seu nome
Digite sua idade
Adaptem e executem esse código por favor para melhor entendimento:

… linhas de praxe…
Scanner dados=new Scanner(System.in);
String nome="";
int contador=1, idade=0;
while (contador<=3)
{
System.out.println(“Digite seu nome:”); nome=dados.nextLine();
System.out.println(“Digite sua idade:”);
idade=dados.nextInt(); contador=contador+1;
}
…outras linhas escrevem os 3 nomes com as idades…
Obs.: O erro só surge a partir da 2ª entrada no loop (while). Agradeço a quem puder me ajudar.

Cara,

Nao testei,mas pelo que eu entendi…
acho q se vc iniciar o contador como 0 nao funfa? na segunda Interação, Contador já vale tres

Att,
Marck

olha se resolve teu problema

import java.util.Scanner;
class Scan{
	public static void main(String args[]){
		Scanner dados = new Scanner(System.in);
		
		String nome=""; 
int contador=1, idade=0; 
while (contador<=3) 
{ 
System.out.print("Digite seu nome:"); 
	nome=dados.next(); 
System.out.print("\nDigite sua idade:"); 
	idade=dados.nextInt();
contador=contador+1; 
} 
	}
}

flw!! agora eu esqueci pq exatamente o nextLine faz isso vi isso qdo tava bem no inicio q ja tive esse problema mais nao lembro perfeitamente a teoria pq acontece quem puder ai dar esse help… seria bom… se nao to enganado o nexLine == vá para proxima linha ai ele vai chega na proxima encontra um println ai ele vai e pula como a proxima linha nao tem nada a respeito de ir para outra linha ele fica ali esperando… vc digitar por isso… nao tenho certeza…

1 curtida

[quote=Marck]Cara,

Nao testei,mas pelo que eu entendi…
acho q se vc iniciar o contador como 0 nao funfa? na segunda Interação, Contador já vale tres

Att,
Marck[/quote]

Amigo Marck, acho que você não entendeu. O problema não é a variável que controla o loop (contador). O problema é o método nextLine( ).

[quote=camilolopes]olha se resolve teu problema

import java.util.Scanner;
class Scan{
	public static void main(String args[]){
		Scanner dados = new Scanner(System.in);
		
		String nome=""; 
int contador=1, idade=0; 
while (contador<=3) 
{ 
System.out.print("Digite seu nome:"); 
	nome=dados.next(); 
System.out.print("\nDigite sua idade:"); 
	idade=dados.nextInt();
contador=contador+1; 
} 
	}
}

flw!! agora eu esqueci pq exatamente o nextLine faz isso vi isso qdo tava bem no inicio q ja tive esse problema mais nao lembro perfeitamente a teoria pq acontece quem puder ai dar esse help… seria bom… se nao to enganado o nexLine == vá para proxima linha ai ele vai chega na proxima encontra um println ai ele vai e pula como a proxima linha nao tem nada a respeito de ir para outra linha ele fica ali esperando… vc digitar por isso… nao tenho certeza…[/quote]

Caro Camilo, como você escreveu funciona. Entretanto, o método next( ) de Scanner só recebe entrada sem espaços. Se alguém entrar com “marcia braga”, por exemplo, o “braga” é perdido. Por isso é que preciso usar o nextLine( ). Mesmo assim, obrigada.

eh esqueci… exatamente dessa parte do nextLine um bom tempo que nao uso :smiley: mais valeu :smiley:

ae galera olha para quem estar com duvida no nextline posso tirar agora.

sempre quando estiver algum atributo do objeto sendo inteiro ou long primeiro e logo em seguida uma String logo abaixo do atributo inteiro ou long coloque um nextLine exemplo:

package visao;
import java.util.Scanner;
import modelo.Cliente;
import modelo.Endereco;
import modelo.Telefone;
public class Principal {

/**
 * @param args
 */
public static void main(String[] args) {
	// TODO Auto-generated method stub
	
	Scanner entrada = new Scanner(System.in);
	
	String nome_cliente;
	int rg_cliente;
	long cpf_cliente;
	
	String rua;
	int cep;
	String bairro;
	int numero;
	String cidade;
	String uf;
	
	String celular;
	String telefone_residencial;
	String telefone_comercial;
	String fax;
	
	int loop = 0;
			
	while(loop<2)
	{
		
		
		loop = loop +1;
		
		
		System.out.println("Digite Nome Cliente: ");			
		nome_cliente = entrada.nextLine();
											
		System.out.println("Digite RG Cliente: ");
		rg_cliente = entrada.nextInt();	
								
		System.out.println("Digite CPF Cliente: ");
		cpf_cliente = entrada.nextLong();
		entrada.nextLine();
		
		System.out.println("Digite Rua: ");
		rua =  entrada.nextLine();
		
		System.out.println("Digite Cep: ");
		cep = entrada.nextInt();
		entrada.nextLine();
		
		System.out.println("Digite Bairro: ");
		bairro = entrada.nextLine();
		
		System.out.println("Digite Numero: ");
		numero =  entrada.nextInt();
		entrada.nextLine();
		
		System.out.println("Digite Cidade: ");
		cidade = entrada.nextLine();
		
		System.out.println("Digite UF: ");
		uf = entrada.nextLine();
		
		System.out.println("Digite Celular: ");
		celular = entrada.nextLine();
		
		System.out.println("Digite Telefone Residencial: ");
		telefone_residencial = entrada.nextLine();
		
		System.out.println("Dogite Telefone Comercial: ");
		telefone_comercial = entrada.nextLine();
		
		System.out.println("Digite Fax: ");
		fax = entrada.nextLine();
		
		
		
		Cliente cliente = new Cliente(nome_cliente,rg_cliente,cpf_cliente);
		Endereco endereco = new Endereco(rua,cep,bairro,numero,cidade,uf);
		Telefone telefone = new Telefone(celular,telefone_residencial,telefone_comercial,fax);
		Cliente clienteendereco = new Cliente(endereco);
		Cliente clientetelefone = new Cliente (telefone);
		
		System.out.println("*****************************************************");
		
		System.out.println("Nome do Cliente: "+cliente.getNome_cliente());
		System.out.println("RG do Cliente: "+cliente.getRg_cliente());
		System.out.println("CPF do Cliente: "+cliente.getCpf_cliente());
		
		System.out.println("*****************************************************");
		
		System.out.println("Rua: "+clienteendereco.getEndereco().getRua());
		System.out.println("Cep: "+clienteendereco.getEndereco().getCep());
		System.out.println("Bairro: "+clienteendereco.getEndereco().getBairro());
		System.out.println("Numero: "+clienteendereco.getEndereco().getNumero());
		System.out.println("Cidade: "+clienteendereco.getEndereco().getCidade());
		System.out.println("UF: "+clienteendereco.getEndereco().getUf());
		
		System.out.println("*****************************************************");
		
		System.out.println("Celular: "+clientetelefone.getTelefone().getCelular());
		System.out.println("Telefone Residencial: "+clientetelefone.getTelefone().getTelefone_residencial());
		System.out.println("Telefone Comercial: "+clientetelefone.getTelefone().getTelefone_comercial());
		System.out.println("Fax: "+clientetelefone.getTelefone().getFax());
		
		System.out.println("*****************************************************");
	}

}

}

isso tbm já aconteceu comigo … e resolve assim … coloque isso dentro do laço … embaixo do while



Scanner dados = new Scanner(System.in); 

valeu galera se alguem tiver duvidas posso ajudar.

para ficar melhor a explicação olhe esse exemplo:

System.out.println("Digite CPF Cliente: ");
cpf_cliente = entrada.nextLong();
entrada.nextLine();

System.out.println("Digite Rua: ");
rua = entrada.nextLine();

repare que encima é um long e abaixo é uma String sempre que for assim é só colocar um nextLine abaixo do

entrada.nextLong();
entrada.nextLine();

ou até mesmo se for inteiro fazer do mesmo jeito

entrada.nextInt();
entrada.nextLine();

isso apenas se for assim mais se encima for String e Abaixo tambem não precisa fazer isso só trabalhar normalmente:

System.out.println("Digite Telefone Residencial: ");
telefone_residencial = entrada.nextLine();

System.out.println("Dogite Telefone Comercial: ");
telefone_comercial = entrada.nextLine();