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

[Bug] Erro após o programa terminar

No desafio, decidi adicionar uma verificação usando o método try, para que o programa não terminasse em erro quando o usuário inserisse uma letra em vez de um número no menu principal, porém, ao encerrar o programa com a opção "-1" Aparece o seguinte erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidade(nota: Eu digitei "f", depois digitei a opção -1, ambos seguidos por enter.) O estranho é que o mesmo não ocorre com as outras opções.

segue uma filmagem do que acontece: https://1drv.ms/v/s!AuCQ2RL2ysuNsxLT0rhme9mdwbtV

Segue o código utilizado (Tive que tirar a mensagem de boas vindas e os comentários por causa do limite de caracteres):

string mensagemDeBoasVindas = "Boas Vindas ao Screen Sound";
Dictionary<string, List<int>> bandasRegistradas = new Dictionary<string, List<int>>();
bandasRegistradas.Add("Linkin Park", new List<int> { 10, 8, 9 });
bandasRegistradas.Add("The Beatles", new List<int>());

}
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()!;
    try
    {
        int opcaoEscolhidaNumerica = int.Parse(opcaoEscolhida);

    }
    catch (Exception)
    {
        Console.WriteLine("\nErro! Digite uma opção válida!");
        Thread.Sleep(2500);
        Console.Clear();
        ExibirOpcoesDoMenu();
    }
    int opcaoEscolhidaNumericaVerificada = int.Parse(opcaoEscolhida);
    
    switch (opcaoEscolhidaNumericaVerificada)
    {
        case 1:
            RegistrarBanda();
            break;
        case 2:
            MostrarBandasRegistradas();
            break;
        case 3:
            AvaliarUmaBanda();
            break;
        case 4:
            ExibirMediaDaBanda();
            break;
        case -1:
            Console.WriteLine("Tchau tchau ^_~");
            break;
        default:
            Console.WriteLine($"A opção {opcaoEscolhidaNumericaVerificada} é inválida");
            break;
    }
}
void RegistrarBanda()
{
    Console.Clear();
    ExibirTituloDaOpcao("Registro de Bandas");
    Console.Write("Digite o nome da banda que deseja registrar: ");
    string nomeDaBanda = Console.ReadLine()!;
    bandasRegistradas.Add(nomeDaBanda, new List<int>());
    Console.WriteLine($"A banda {nomeDaBanda} foi registrada com sucesso!");
    Thread.Sleep(2500);
    Console.Clear();
    ExibirOpcoesDoMenu();
}
void MostrarBandasRegistradas()
{
    Console.Clear();
    ExibirTituloDaOpcao("Exibindo todas as bandas registradas");
    
    foreach (string banda in bandasRegistradas.Keys)
    {
        Console.WriteLine($"Banda: {banda}");
    }
    Console.Write("\nPressione uma tecla para voltar ao menu principal");
    Console.ReadKey();
    Console.Clear();
    ExibirOpcoesDoMenu();

}

void AvaliarUmaBanda()
{

    Console.Clear();
    ExibirTituloDaOpcao("Avaliar Banda");
    Console.Write("Digite o nome da banda que deseja avaliar: ");
    string nomeDaBanda = Console.ReadLine()!;
    if (bandasRegistradas.ContainsKey(nomeDaBanda))
    {
        Console.Write($"Qual a nota que a banda {nomeDaBanda} merece: ");
        int nota = int.Parse(Console.ReadLine()!);
        bandasRegistradas[nomeDaBanda].Add(nota);
        Console.WriteLine($"\nA nota {nota} foi registrada com sucesso para a banda {nomeDaBanda}!");
        Thread.Sleep(3000);
        Console.Clear();
        ExibirOpcoesDoMenu();
    }
    else
    {
        Console.WriteLine($"\nA banda {nomeDaBanda} não foi encontrada!");
        Console.Write("Pressione uma tecla para voltar ao menu principal");
        Console.ReadKey();
        Console.Clear();
        ExibirOpcoesDoMenu();
    }
}
void ExibirMediaDaBanda()
{
    Console.Clear();
    ExibirTituloDaOpcao("Mostrar a média de uma banda");
    Console.Write("Digite o nome da banda que gostaria de ver a média das notas:");
    string nomeDaBanda = Console.ReadLine()!;
    if (bandasRegistradas.ContainsKey(nomeDaBanda))
    {
        string mediaDaBanda = bandasRegistradas[nomeDaBanda].Average().ToString();
        Console.WriteLine($"\nA média das notas da banda {nomeDaBanda} é: {mediaDaBanda} ");
        Console.Write("\nPressione uma tecla para voltar ao menu principal:");
        Console.ReadKey();
        Console.Clear();
        ExibirOpcoesDoMenu();
    }
    else
    {
        Console.WriteLine($"\nA banda {nomeDaBanda} ainda não foi registrada!");
        Thread.Sleep(2500);
        Console.Clear();
        ExibirOpcoesDoMenu();
    }

}
void ExibirTituloDaOpcao(string titulo)
{
    int quantidadeDeLetras = titulo.Length;
    string asteriscos = string.Empty.PadLeft(quantidadeDeLetras, '*');
    Console.WriteLine(asteriscos);
    Console.WriteLine(titulo);
    Console.WriteLine(asteriscos + "\n");

}
ExibirOpcoesDoMenu();
4 respostas

Olá, você está executando int opcaoEscolhidaNumerica = int.Parse(opcaoEscolhida); duas vezes,

remova o int opcaoEscolhidaNumerica = int.Parse(opcaoEscolhida); logo após o bloco try..catch

E mude o nome opcaoEscolhidaNumerica para opcaoEscolhidaNumericaVerificada dentro do try

Nessa região :

.
.
.
    }
    int opcaoEscolhidaNumericaVerificada = int.Parse(opcaoEscolhida);   //remova essa linha

Olá, obrigado pela sugestão, mas o Visual Studio indica que isso não é válido: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeContinuo no aguardo de uma possível solução.

solução!

Olá..

O preograma não está "enxergando" a variável, pois ela está sendo definida no bloco try, então seu escopo está limitado apenas ao bloco try..

Defina opcaoEscolhidaNumericaVerificada, fora do bloco try..catch, antes do try, assim: int opcaoEscolhidaNumericaVerificada = 0; remova o int da declaração dentro do try, deixe só assim: opcaoEscolhidaNumericaVerificada = int.Parse(opcaoEscolhida);

Obrigado. Tive que adaptar um pouco o código mas funcionou corretamente.