#c# #try-catch #formatexception
#c# #try-catch #formatexception
Вопрос:
Есть ли какой-либо способ перехватить исключение формата здесь, кроме использования 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' amp;amp; char.ToUpper(playornot) != 'N')
return false;
return true;
}
Комментарии:
1. Почему вы
char
все равно используете? Вы могли бы использовать строку, возвращеннуюConsole.ReadLine
непосредственно из.
Ответ №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 Используйте консоль.Ключ для чтения:
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 Используйте простой метод для получения символа из строки чтения:
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());
}
Комментарии:
1. этот ответ правильный, но вторая строка чтения () должна быть преобразована в Read()
2. @MohammadRasouli Да, спасибо за подсказку.