【问题标题】:Controlling format exception without try-catch blocks在没有 try-catch 块的情况下控制格式异常
【发布时间】:2021-03-30 09:22:28
【问题描述】:

除了使用try-catch 语句之外,还有什么方法可以捕获格式异常吗?如果用户输入的内容不止一个字符,则会出现格式异常。这是我的代码:

public void Menu()
{
    Console.WriteLine("Would you like to play RPS? y/n");
    char playOrNot = Convert.ToChar(Console.ReadLine());
    while(!validateChoice(playOrNot))
    {
        Console.WriteLine("Invalid! please re-enter selection");
        playOrNot = Convert.ToChar(Console.ReadLine());
    }
    if (playOrNot == 'Y' || playOrNot == 'y')
    {
        Console.Clear();
        PlayGame();
    }
}
public bool validateChoice(char playornot)
{
    if (char.ToUpper(playornot) != 'Y' && char.ToUpper(playornot) != 'N')
        return false;
    return true;
}

【问题讨论】:

  • 你为什么还要使用char?您可以直接使用从Console.ReadLine 返回的字符串。

标签: c# try-catch formatexception


【解决方案1】:

有多种选择。

1 改用字符串:

public void Menu()
{
    Console.WriteLine("Would you like to play RPS? y/n");
    string playOrNot = Console.ReadLine();
    while(!validateChoice(playOrNot))
    {
        Console.WriteLine("Invalid! please re-enter selection");
        playOrNot = Console.ReadLine();
    }
    if (playOrNot.ToUpper() == "Y")
    {
        Console.Clear();
        PlayGame();
    }
}
public bool validateChoice(string playornot)
{
    return !"YN".Contains(playOrNot);
}

2 使用 Console.ReadKey:

public void Menu()
{
    Console.WriteLine("Would you like to play RPS? y/n");
    char playOrNot = Console.ReadKey();
    while(!validateChoice(playOrNot))
    {
        Console.WriteLine("Invalid! please re-enter selection");
        playOrNot = Console.ReadKey();
    }
    if (char.ToUpper(playOrNot) == 'Y')
    {
        Console.Clear();
        PlayGame();
    }
}
public bool validateChoice(char playornot)
{
    return !"YN".Contains(char.ToUpper(playOrNot));
}

3 使用简单的方法从ReadLine中获取char:

public void Menu()
{
    Console.WriteLine("Would you like to play RPS? y/n");
    char playOrNot = GetChar();
    while(!validateChoice(playOrNot))
    {
        Console.WriteLine("Invalid! please re-enter selection");
        playOrNot = Console.GetChar();
    }
    if (char.ToUpper(playOrNot) == 'Y')
    {
        Console.Clear();
        PlayGame();
    }
}
public bool validateChoice(char playornot)
{
    return !"YN".Contains(char.ToUpper(playOrNot));
}
public char GetChar()
{
    string line = Console.ReadLine();
    if (line.Length == 1)
        return line[0]; // first char of line
    return (char)0;
}

【讨论】:

    【解决方案2】:

    与其依赖于控制流的异常,不如一开始就尽量避免它们。在您的情况下,您可以使用Read 而不是ReadLine 来做到这一点。因此,您只能读取一个字符:

    Console.WriteLine("Would you like to play RPS? y/n");
    char playOrNot = Convert.ToChar(Console.Read());
    while(!validateChoice(playOrNot))
    {
        Console.WriteLine("Invalid! please re-enter selection");
        playOrNot = Convert.ToChar(Console.Read());
    }
    

    【讨论】:

    • 这个答案是对的,但是第二个 Readline() 必须转换为 Read()
    • @MohammadRasouli 是的,感谢您的提示。
    猜你喜欢
    • 2011-08-25
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多