Search code examples
c#switch-statementtry-catchcase

c# Switch case does not continue after try catch - Need a loop to enter a valid data type


When i introduce the "try" "catch" statements and read the user input for the "choice" variable, the code executes as it should it does not however continue on to the "switch" "case" statement as the "choice" variable is then said to be an unassigned local variable. Please help.

I was expecting the rest of the "switch case" code to execute.

int choice;

do
{
    Console.Clear();
    Console.WriteLine("1. Load Data");
    Console.WriteLine("2. Add Customer");
    Console.WriteLine("3. Sort Customers");
    Console.WriteLine("4. Display Customers");
    Console.WriteLine("5. Edit Customer");
    Console.WriteLine("6. Exit\n");
    Console.WriteLine("Chose an option 1-6: ");

    bool valid = true;
    do
    {
        try
        {
            choice = Convert.ToInt32(Console.ReadLine());
        }
        catch (Exception)
        {
            valid = false;
            Console.WriteLine("please enter a number from 1 - 6");
        }
    } while (valid == false);
    switch (choice)
    {
        case 1:
            break;
        case 2:
            break;
        case 3:
            break;
        case 4:
            break;
        case 5:
            break;
        default:
            break;
    }
    Console.Clear();
} while (choice != 6);

Solution

  • When the catch block is executed, then choice is not assigned a value in the try block.

    Assign a value to choice in the catch block

    int choice; // Choice is declared here but is not assigned a value.
    
    ...
    
    try
    {
        // When the conversion fails, no assignment to `choice` is made.
        choice = Convert.ToInt32(Console.ReadLine());
        valid = true; // This was also missing.
    }
    catch (Exception)
    {
        valid = false;
        choice = 0; // <========================================
        Console.WriteLine("please enter a number from 1 - 6");
    }
    
    ...
    
    // Now, here `choice` is known to have a value assigned in any case.
    

    Note that the compiler does not consider the value of valid nor does the compiler analyze how it affects the control flow when is says that choice may be unassigned. The error message is based solely on a static analysis of the control flow for assignments made to choice itself.

    But it would be easier to use TryParse instead of catching an exception.

    int choice;
    do {
        // Console output ...
        while (!Int32.TryParse(Console.ReadLine(), out choice)) {
            Console.Write("please enter a number from 1 - 6: ");
        }
        Console.WriteLine();
        switch (choice) {
            ...
            default:
                break;
        }
        Console.Clear();
    } while (choice != 6);