Next() Pega Só Uma Palavra e nextLine() Não Pega Nada

Boa tarde.
Este exercício pede para criar uma agenda com apenas um mês e cada dia com suas 24 horas, dando um menu para o usuário escolher entre editar um dia e um horário ou consultar um dia e um horário com seu compromisso.
O problema, quando uso scan.next(), só pega uma palavra e quando uso scan.nextLine() não pega nada e volta a repetir do começo.
Segue:

package com.leandro.aula20.labs;

import java.util.Scanner;

public class Exer04 {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String[][] agendaMes = new String[31][24]; // de 0 a 30 e de 0 a 23
    boolean validaRepeticao = true;
    int menu = 0;
    int dia = 0;
    int hora = 0;

    do {
        System.out.println("Você quer editar a agenda ou consultar? (1-editar, 2-consultar e 3-sair.)");
        menu = scan.nextInt();

        if (menu != 1 & menu != 2 & menu != 3) {
            do {
                System.out.println("Opção inválida. Tente novamente.\n"
                        + "Você quer editar a agenda ou consultar? (1-editar, 2-consultar e 3-sair.)");
                menu = scan.nextInt();

            } while (menu != 1 & menu != 2 & menu != 3);
        }

        if (menu == 1) {
            System.out.println("Digite o dia e a hora separados por espaço ou enter.");
            dia = scan.nextInt();
            hora = scan.nextInt();
            System.out.println("Digite o compromisso para o dia " + dia + " e para a hora " + hora);
            agendaMes[dia - 1][hora - 1] = scan.nextLine();
            System.out.println("Edição da Agenda: \nO compromisso do dia " + dia + " e da hora " + hora + ":"
                    + " " + agendaMes[dia - 1][hora - 1]);
        }

        if (menu == 2) {
            System.out.println("Digite o dia e a hora separados por espaço ou enter.");
            dia = scan.nextInt();
            hora = scan.nextInt();
            System.out.println("Contulta da Agenda: \nO compromisso do dia " + dia + " e da hora " + hora + ":"
                    + " " + agendaMes[dia - 1][hora - 1]);
        }

        if (menu == 3) {
            System.out.println("Programa finalizado. Até breve.");
            validaRepeticao = false;
        }
    } while (validaRepeticao);
}

}

Leu o javadoc da classe Scanner? Se não, sugiro fortemente.

Resumindo: o método next lê a próxima entrada textual, até a primeira interrupção (espaço, tab, enter)
nextLine lê tudo o que existe na linha, até encontrar um “\n” (enter, indica que a linha foi inserida por completo pelo usuário).

Ocorre que, provavelmente, você esteja lendo um número antes de tentar ler o que está apresentando problemas.
Quando você lê um número com nextInt, nextFloat, nextDouble, nextLong, etc, você deixa uma espécie de lixo, o “\n”, que é lido pelo nextLine e ignorado pelo next.

Como resolver:

  • Para usar o next, o usuário precisa inserir toda a linha entre aspas “”
  • O correto é usar nextLine para tudo e, de acordo com o caso, ir transformando.

Como você falou, estou usando o nextLine(), mas o que posso fazer para ele pegar a próxima linha? Se não está.

Veja que você tem várias chamadas ao nextInt().
Isso vai fazer com que, ao chegar nesta linha

Você só leia a informação “\n” que ficou para trás.

A minha sugestão é substituir o nextInt() por

dia = Integer.parseInt(scan.nextline());

Isso vai resolver o problema.

Porém, você pode optar por:

dia = scan.nextInt();

scan.nextLine();//Após cada nextInt, colocar um nextLine.

Embora eu não goste da última abordagem, também funciona.

PS: Não entendo o motivo de ao usar uma palavra acentuada, diferente de todas as outras opções em que apresenta os acentos normalmente, nessa última nextLine, uma palavra acentuada teve no lugar da letra acentuada um quadradinho.

Veja:

run:
Você quer editar a agenda ou consultar? (1-editar, 2-consultar e 3-sair.)
1
Digite o dia e a hora separados por espaço ou enter.
20
10
Digite o compromisso para o dia 20 e para a hora 10
Ir no árabe da Afonso Pena.
Edição da Agenda:
O compromisso do dia 20 e da hora 10: Ir no �rabe da Afonso Pena.
Você quer editar a agenda ou consultar? (1-editar, 2-consultar e 3-sair.)
2
Digite o dia e a hora separados por espaço ou enter.
20
10
Contulta da Agenda:
O compromisso do dia 20 e da hora 10: Ir no �rabe da Afonso Pena.
Você quer editar a agenda ou consultar? (1-editar, 2-consultar e 3-sair.)

Anteriormente:
Deu certo a segunda opção:

"Porém, você pode optar por:

dia = scan.nextInt();
scan.nextLine();//Após cada nextInt, colocar um nextLine".