Porque o array de String não mostra o que foi inserido?

Boa noite pessoal, não estou entendendo por qual motivo o que insiro em string não é mostrado no ultimo for, sendo que o de int é mostrado normalmente, desde já agradeço a ajuda.

public static void main(String[] args) {
	Scanner leitor = new Scanner(System.in);
	
	String nome[]= new String[2];
	int idade[] = new int[2];
	
	for (int i = 0; i < nome.length; i++) {
		System.out.println("Digite seu nome : ");
		leitor.next();
		nome[i] = leitor.nextLine();
		
		System.out.println("Digite sua idade : ");
		idade[i] = leitor.nextInt();
	}
	
	for (int i = 0; i < nome.length; i++) {
		System.out.println("Nomes cadastrados: "+nome[i]);
		System.out.println("Idades cadastradas: "+idade[i]);
	}
}

Sabe esta linha?

leitor.next();

É esta chamada do next() que está pegando o nome que vc digita. Ele pega o nome e deixa a quebra de linha.

Quando chega nesta linha:

nome[i]=leitor.nextLine();

Tudo o que sobrou foi a quebra de linha. O nextLine exclui a quebra de linha e retorna uma String vazia e é isso que está sendo mostrado no seu segundo for.

Só por curiosidade, quando ele pedir o nome, experimenta colocar nome e sobrenome. Ao invés de escrever só João, usa algo como João Silva. Vc vai ver que no segundo for, vai mostrar apenas o sobrenome.

Isto porque o next() consome o João e o nextLine() fica com o Silva.

Eu entendi sua intenção ao colocar aquele next() isolado, mas, além de ele estar no lugar errado, deveria ser um nextLine() ao invés de next().

Para corrigir, faça isto:

for (int i = 0; i < nome.length; i++) {
  System.out.println("Digite seu nome : ");
  nome[i] = leitor.nextLine();
  System.out.println("Digite sua idade : ");
  idade[i] = leitor.nextInt();
  leitor.nextLine();
}

Ou melhor ainda:

for (int i = 0; i < nome.length; i++) {
  System.out.println("Digite seu nome : ");
  nome[i] = leitor.nextLine();
  System.out.println("Digite sua idade : ");
  idade[i] = Integer.parseInt(leitor.nextLine());
}
2 curtidas

Estava usando o leitor.next(); antes do idade[i] = leitor.nextInt(); pois durante a repetição do for o
System.out.println("Digite seu nome : ");
System.out.println("Digite sua idade : ");
estavam vindo juntos sem o tempo de solicitar o primeiro e o segundo,
após o idade[i] = Integer.parseInt(leitor.nextLine());
que você falou ficou normal, mas por qual motivo acontece isso ?
Obrigado por toda a explicação.

Eu sei. Por isso eu te disse que entendi sua intenção, mas que vc colocou as coisas na linha errada.

Na verdade eu te dei 2 opções. Uma que usa o nextInt() + nextLine() e outra que usa nextLine() + Integer.parseInt().


Quando vc digita João e pressiona Enter, vc está inserindo os caracteres j, o, ã, o e mais o caracter de nova linha.

O método nextLine() consome a linha toda e a retorna, descartando o caracter de nova linha.

Os métodos next() e nextInt() consomem apenas uma String ou um int e, se encontram um caracter de nova linha, eles o deixam lá, sem consumí-lo, apenas o ignoram.

Quando o loop entra na segunda iteração, o seu nextLine() encontra o caracter de nova linha deixado pelo nextInt da iteração anterior e o consome sem nem pedir para o usuário entrar com a informação.

Na minha primeira sugestão de usar nextInt() + nextLine(), invocar o nextLine() na próxima linha após o nextInt() consome o caracter de nova linha deixado pelo nextInt() e quando o loop começa a segunda iteração, como não há resíduos, o programa funciona como esperado.

Na minha segunda sugestão de usar nextLine() + Integer.parseInt(), nós não temos mais o problema do caracter de nova linha residual, mas precisamos fazer a conversão para int manualmente usando o Integer.parseInt().


Aqui tem eu tentando explicar isso também:

2 curtidas

Se quiser uma explicação mais detalhada:

2 curtidas