C # - Получение ошибки при попытке проанализировать пользовательский ввод в int - PullRequest
1 голос
/ 08 сентября 2010

Я новичок в c #, и я не могу понять, почему я продолжаю получать сообщение об ошибке «FormatException unhandled» при запуске этого метода:

public void bet()
{
    int betAmount;

    Console.WriteLine("How much would you like to bet?");
    betAmount = int.Parse(Console.ReadLine());
    Console.WriteLine(_chips - betAmount);
} 

Программа не перестает ждать ввода пользователя, и я не знаю, почему это так?

Что я могу сделать, чтобы программа ожидала ввода пользователя в этом методе?

** Я запускал программу на Microsoft Visual C # 2010 Express как консольное приложение.

Ответы [ 3 ]

7 голосов
/ 08 сентября 2010

Вам необходимо обработать случай, когда Console.ReadLine() возвращает что-то, что не является целочисленным значением.В вашем случае вы, вероятно, получаете эту ошибку, потому что что-то напечатано неправильно.

Вы можете решить эту проблему, переключившись на TryParse :

public void bet()
{
    int betAmount;

    Console.WriteLine("How much would you like to bet?");
    while(!int.TryParse(Console.ReadLine(), out betAmount))
    {
        Console.WriteLine("Please enter a valid number.");
        Console.WriteLine();
        Console.WriteLine("How much would you like to bet?");
    }

    Console.WriteLine(_chips - betAmount);
} 

int.TryParseвернет false, если пользователь введет что-то отличное от целого числа.Приведенный выше код заставит программу постоянно повторять запрос пользователя, пока он не введет действительный номер, вместо того, чтобы поднимать FormatException.

Это распространенная проблема - каждый раз, когда вы анализируете пользовательский ввод, вынеобходимо убедиться, что ввод был введен в правильном формате.Это может быть сделано с помощью обработки исключений или с помощью пользовательской логики (как указано выше) для обработки неправильного ввода.Никогда не доверяйте пользователю правильно вводить значения.

0 голосов
/ 08 сентября 2010

Вы используете Visual Studio?Некоторые другие IDE могут по умолчанию запускать консольные приложения в неинтерактивном режиме.Например, я знаю, что в MonoDevelop вам нужно специально изменить свойства проекта, чтобы программа запускалась во внешней консоли, если вы хотите это сделать.

0 голосов
/ 08 сентября 2010

Может быть лучше и более пуленепробиваемо использовать регулярные выражения для ввода цифр, таких как, например:

public static Regex NumInpRegex = new Regex(
      "^(?<inp_num>\\d+)$",
    RegexOptions.IgnoreCase
    | RegexOptions.Singleline
    | RegexOptions.ExplicitCapture
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );
string InputText = Console.ReadLine();
Match m = NumInpRegex.Match(InputText);
if (m.Success && InputText.Length > 0){
    betAmount = int.Parse(m.Groups["inp_num"].Value);
    Console.WriteLine(_chips - betAmount);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...