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]);
}
}
É 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());
}
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().