Não consigo inserir o nome completo de uma pessoa em um array Java

Olá, boa tarde. Sou iniciante em Java, e estou fazendo um programa usando arrays/vetores. Meu programa deve armazenar o nome completo de um aluno e em seguida sua nota. Bom, é o seguinte: como quero que o meu Scanner armazene o nome completo do aluno no vetor, e não apenas o primeiro nome, eu uso o nextLine(); só que quando vou executar dá erro. O código pula a parte em que eu iria digitar o nome do aluno e manda logo digitar a nota. Alguém sabe me dizer porque isso acontece ? Será que não é possível usar um nextLine(); para armazenar uma linha de texto em um vetor ? Será que só posso armazenar uma palavra ?

package Aulas;
import java.util.Scanner;
public class aulajava{
public static void main(String[] args){
//ARRAYS

int quantalunos = 0;
Scanner input = new Scanner(System.in);

System.out.println("Informe a quantidade de alunos: ");
quantalunos = input.nextInt();

double[] notasalunos = new double[quantalunos];
String[] nomesalunos = new String[quantalunos];

for (int i = 0; i < quantalunos; i++){
System.out.println("------------------------------");
System.out.println("Nome do aluno " + (i+1) + ": ");
nomesalunos[i] = input.nextLine(); <== O PROGRAMA PULA ESSA PARTE
System.out.println("Nota do aluno " + (i+1) + ": ");
notasalunos[i] = input.nextDouble();
}

}
}

OBS: Quando eu troco o nextLine(); pelo next(); funciona perfeitamente, pórem só armazena o primeiro nome e eu quero armazenar o nome completo.

Funciona mais ou menos assim: O Scanner analisa a entrada de dados vindas do teclado -Scanner(Sistem.in) e separa a entrada em partes chamadas de token toda vez que encontra um delimitador que, por padrão é um espaço em branco e armazena esses tokens na variável do tipo Scanner. Quando você chama o método nextInt(), o cursor que estava fora no começo do primeiro token avança até encontrar o próximo token e para. Tentar converter o valor lido para inteiro. Se conseguir, retorna o valor convertido para a variável designada para recebê-lo. No entanto, é preciso dar um enter para que o inteiro seja ‘carregado’ na variável que irá receber. Por exemplo, supondo que digite 291, tens que pressionar enter para que o método faça a conversão, porque nesse caso não limitador de token. Então você precisa indicar que a linha acabou. Logo:

input.nextInt() recebe "291\n". No entanto ele lê tudo, menos a indicação de quebra de linha. Logo: quantalunos = 291 convertido para inteiro. No entanto isso deixa lixo no Scanner, justamente o “\n”.
Quando você usa o método nextLine() ele lê toda a linha anterior, recupera as entradas ignorada e posiciona o cursor na próxima linha. ao mesmo tempo que retorna o que ele leu da linha anterior. Como havia um “\n” que é uma quebra de linha é isso que ele faz, dá uma quebra de linha. Com isso ele pula a próxima linha. Exemplo, a grosso modo:

linha1: “291\n”;
texto = input.nextLine();
texto = “\n, -> começo da próxima linha”;//linha2
text = "-> linha2" //mas pula para a linha 3 porque ele tem uma quebra de linha armazenada
linha2: “789” //Não lê porque pulou direto para o começo de uma próxima linha (linha 3)
linha3:

Onde -> indica para onde o método manda o cursor.

Então você pode contornar esse problema de duas formas:

1 - Lê tudo com o nexLine() e converte para o tipo de se queira em momento posterior;
2 - Interponha um nextLine() sempre que a leitura anterior não for nextLine e o posterior o for. Nesse caso:

quantalunos = input.nextInt();
input.nextLine();
1 curtida

Obrigado pela ajuda !!! Não estava conseguindo entender o que estava dando errado no meu programa. No caso, usei a forma dois que você sugeriu e funcionou bem. :+1: