从控制台获取用户输入时出现“System.FormatException” - visual c#

时间:2013-10-25 18:18:22

标签: c# console-application

我正在尝试创建一个命令行程序,它会询问您是否需要快速和长时间发出哔声。我在下面的代码中不断获得System.FormatException。我在Console.WriteLine("how many times should i beep?");之后立即解决了问题。我通过在此行后面加console.read();//pause找到了修复方法。

我的问题是我做错了什么?或者我想在那条线之后暂停?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("how fast would you like the sounds to play?");
        Console.WriteLine("70 = fast and 300 = slow can pick any number inbetween");
        string choice = Console.ReadLine();
        int speed = Convert.ToInt32(choice);
        Console.Write(speed);
        Console.Read();//pause
        Console.WriteLine("how many times should i beep?");
        string choice2 = Console.ReadLine();
        int j = Convert.ToInt32(choice2);
        Console.Write(j);
        Console.Read();//pause
        for (int i = 0 ; i < j; i++)
        {
            Console.Beep(1000, speed);
        }
    }
}

4 个答案:

答案 0 :(得分:6)

我的通灵调试技巧告诉我,正是这条线抛出异常:

int j = Convert.ToInt32(choice2);

像你之前提到的那样放入Console.Read()会导致该行不立即执行并延迟抛出异常。

如果您在此行输入的内容不是整数:

string choice2 = Console.ReadLine();

您将在以下FormatException来电中获得Convert.ToInt32

当您传递的值FormatException

时,请documentation for Convert.ToInt32告诉您does not consist of an optional sign followed by a sequence of digits (0 through 9).被抛出的位置

要解决您的问题,请使用Int32.TryParse(或只是确保输入有效的整数)。这将返回一个布尔值,指示解析的成功或失败,而不是抛出异常。

另外,欢迎来到StackOverflow!请务必提供有用的答案,并接受最能解决问题的答案。

答案 1 :(得分:3)

为什么那些额外的Console.Read()在那里?它们会破坏您的程序,因为用户会按return太多次

    Console.WriteLine("how fast would you like the sounds to play?");
    Console.WriteLine("70 = fast and 300 = slow can pick any number inbetween");
    string choice = Console.ReadLine();
    int speed = Convert.ToInt32(choice);
    Console.WriteLine(speed);
    Console.WriteLine("how many times should i beep?");
    string choice2 = Console.ReadLine();
    int j = Convert.ToInt32(choice2);
    Console.Write(j);
    for (int i = 0; i < j; i++)
    {
        Console.Beep(1000, speed);
    }

答案 2 :(得分:0)

实际上,您需要做的只是删除您投放的Read()暂停。我可能还会更改Write()来电WriteLine()来电。

如果您坚持在此处“暂停”,也可以将Read()来电更改为ReadLine()来电。

答案 3 :(得分:-1)

试试这个:

    Console.Read();
    string choice2 = Console.ReadLine();