Problema com next() & nextLine()

Bom, já olhei alguns tópicos sobre esse assunto mas são muito antigos e não me ajudaram.

Quando vou agendar um compromisso e digito algo que contenha espaço, tipo, ‘Estudar para a prova’, parece que só é armazenada a primeira palavra, tentei usar o nextLine(), mas aí ele já salta para a próxima linha, sem deixa eu digitar o compromisso.

import java.util.Scanner;

public class Exercicio4 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		String agendaComprom[][][] = new String[12][30][24];
		
		int d,m,h;
		String resp, resp2;
		
		do {
			
			System.out.println("MENU - AGENDA DE COMPROMISSOS \n--------------------------------");
			System.out.print("\nInforme o DIA, MÊS e HORA em que você \ndeseja agendar/alterar um compromisso: ");
			
			d = scan.nextInt();
			m = scan.nextInt();
			h = scan.nextInt();
			
			for(int i=1; i<=12; i++) {
				for(int j=1; j<=30; j++) {
					for(int k=1; k<=24; k++) {
						if(m == i && d == j && h == k)
						{
							System.out.print("Digite o nome do compromisso: ");
							agendaComprom[i][j][k] = scan.nextLine();
						}
					}
				}
			}
			
			System.out.println("MENU - FINAL\n--------------------------------");
			System.out.print("\nVocê quer verificar à agenda? [S/N]");
			resp2 = scan.next();
			
			if(resp2.equals("S") || resp2.equals("s"))
			{
				System.out.print("Entre com o DIA, MÊS e HORA no qual você quer VERIFICAR o compromisso: ");
				d = scan.nextInt();
				m = scan.nextInt();
				h = scan.nextInt();
				
				for(int i=1; i<=12; i++) {
					for(int j=1; j<=30; j++) {
						for(int k=1; k<=24; k++) {
							if(m == i && d == j && h == k)
							{
								System.out.print("Compromisso do dia " + d + ", mês " + m + " e hora " + h + "h : "
										+ agendaComprom[i][j][k]);
							}
						}
					}
				}	
			}
			
			System.out.print("\nVocê deseja adicionar/alterar mais algum compromisso? [S/N]");
			resp = scan.nextLine();
			
		}while(resp.equals("S") || resp.equals("s"));	
		
		System.out.println("\nAGENDA FINALIZADA!");
		
	}
	
}

Scanner é cheio de pegadinhas…

Uma das formas de resolver isso é fazer o seguinte: criar dois Scanners um para NÚMEROS e outro para STRING, então digamos que você vai criar o scan1 e scan2, o scan1 só vai trabalhar com números e scan2 com String (não necessariamente String, mas tudo que não seja número).

Por que fazer isso? Porque quando você usa um Scanner para pedir um número e depois usa o mesmo para pedir uma String (nextLine) ele simplesmente é ignorado.

Então no DIA, MÊS e ANO você usaria scan1.nextInt()
e quando for pedir um nome você usa scan2.nextLine()

Outra forma, não tão correta é acima desse scan que estiver dando erro você colocar outro em cima dele, assim o que estiver em cima dele vai passar despercebido e o outro vai pedir a informação do usuário.

System.out.print("Digite o nome do compromisso: ");
		scan.nextLine(); //vai ser ignorado
		agendaComprom[i][j][k] = scan.nextLine(); //vai pedir a informação
1 curtida

O único método que consome a quebra de linha é o nextLine().
Se você fizer next(), nextInt() ou nextDouble(), precisa fazer um nextLine() em seguida, para consumir a quebra de linha que ficou no buffer.
Outra opção é usar somente o método nextLine() e fazer parsing do resultado.

2 curtidas