Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] O que fazer para o terminal não ser encerrado quando uma tecla errada é apertada no menu?

Eu conclui o curso (muito bom, obrigado!) e quando fui fazer o último teste pra ver se tudo estava funcionando percebi uma coisa:

void ExibirOpcoesdoMenu()
{
    ExibirLogo();
    Console.WriteLine("\nDigite 1 para registrar uma banda");
    Console.WriteLine("Digite 2 para mostrar todas as bandas");
    Console.WriteLine("Digite 3 para avaliar uma banda");
    Console.WriteLine("Digite 4 para exibir a média de uma banda");
    Console.WriteLine("Digite -1 para sair");
    Console.Write("\nDigite a sua opção: ");
    string opcaoEscolhida = Console.ReadLine()!;
    int opcaoEscolhidaNumerica = int.Parse(opcaoEscolhida);
    switch (opcaoEscolhidaNumerica)
    {
        case 1: RegistrarBanda();
            break;
        case 2: MostrarBandasRegistradas();
            break;
        case 3: AvaliarUmaBanda();
            break;
        case 4: ExibirMediaBanda();
            break;
        case -1: Console.WriteLine("Tchau :)");
            break;
        default: Console.WriteLine("Opção inválida");
            break;
    }
}

No final dessa parte do código tem default: Console.WriteLine("Opção inválida");. Essa função está funcionando apenas para números, ou seja se eu digitar um número que não é -1, 1, 2, 3 ou 4 vai aparecer "Opção inválida", mas se eu botar uma letra ou outro algarismo aparece uma mensagem de erro e reinicia o programa. Eu queria saber como eu posso alterar essa função para englobar também outros tipos de caracteres e não só números para não reiniciar a aplicação. Obrigado!

2 respostas
solução!

Oi Samuel! Tudo joia?

Parabéns por concluir o curso! Fico feliz que você tenha gostado.

Sobre a sua dúvida, o problema ocorre porque o método int.Parse tenta converter a entrada do usuário diretamente para um número inteiro. Se a entrada não for um número válido, ele lança uma exceção, causando o encerramento do programa.

Para resolver isso, você pode usar o método int.TryParse que tenta fazer a conversão e retorna um valor booleano indicando se a conversão foi bem-sucedida ou não. Dessa forma, você pode lidar com entradas inválidas sem que o programa seja encerrado. Aqui está uma sugestão de como você pode modificar seu código:

void ExibirOpcoesdoMenu()
{
    ExibirLogo();
    Console.WriteLine("\nDigite 1 para registrar uma banda");
    Console.WriteLine("Digite 2 para mostrar todas as bandas");
    Console.WriteLine("Digite 3 para avaliar uma banda");
    Console.WriteLine("Digite 4 para exibir a média de uma banda");
    Console.WriteLine("Digite -1 para sair");
    Console.Write("\nDigite a sua opção: ");
    string opcaoEscolhida = Console.ReadLine()!;
    
    if (int.TryParse(opcaoEscolhida, out int opcaoEscolhidaNumerica))
    {
        switch (opcaoEscolhidaNumerica)
        {
            case 1: RegistrarBanda();
                break;
            case 2: MostrarBandasRegistradas();
                break;
            case 3: AvaliarUmaBanda();
                break;
            case 4: ExibirMediaBanda();
                break;
            case -1: Console.WriteLine("Tchau :)");
                break;
            default: Console.WriteLine("Opção inválida");
                break;
        }
    }
    else
    {
        Console.WriteLine("Entrada inválida, por favor digite um número.");
    }
}

Com essa alteração, se o usuário digitar algo que não seja um número, o programa exibirá "Entrada inválida, por favor digite um número." e continuará executando sem encerrar.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Muito obrigado!