&引用;System.FormatException“;从控制台获取用户输入时-visual c#

&引用;System.FormatException“;从控制台获取用户输入时-visual c#,c#,console-application,C#,Console Application,我正在尝试制作一个命令行程序,它会询问您是否希望它发出快速和长时间的嘟嘟声。我在下面的代码中不断得到System.FormatException。我在Console.WriteLine(“我应该嘟嘟几声?”)之后就发现了问题。我通过放置console.read()找到了一个修复方法//在这一行之后暂停 我的问题是我做错了什么?还是我应该在那一行之后暂停 using System; using System.Collections.Generic; using System.Linq; using

我正在尝试制作一个命令行程序,它会询问您是否希望它发出快速和长时间的嘟嘟声。我在下面的代码中不断得到
System.FormatException
。我在
Console.WriteLine(“我应该嘟嘟几声?”)之后就发现了问题。我通过放置
console.read()找到了一个修复方法//在这一行之后暂停

我的问题是我做错了什么?还是我应该在那一行之后暂停

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);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
班级计划
{
静态void Main(字符串[]参数)
{
Console.WriteLine(“您希望声音播放多快?”);
Console.WriteLine(“70=快速,300=慢速,可在两者之间选择任意数字”);
字符串选项=Console.ReadLine();
int速度=转换为32(选项);
控制台。写入(速度);
Console.Read();//暂停
WriteLine(“我应该嘟嘟几声?”);
string choice2=Console.ReadLine();
int j=转换为32(选项2);
控制台。写入(j);
Console.Read();//暂停
对于(int i=0;i
我的心理调试技能告诉我,是这一行引发了异常:

int j = Convert.ToInt32(choice2);
Console.Read()
像前面提到的那样放入,这会导致该行不会立即执行,并延迟异常的抛出

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

string choice2 = Console.ReadLine();
在下面的
Convert.ToInt32
调用中,您将得到一个
FormatException

请参阅,当传递的值
不包含后跟数字序列(0到9)的可选符号时,将抛出
格式异常

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


另外,欢迎来到StackOverflow!确保对您觉得有用的答案进行投票,并接受最能解决您问题的答案。

为什么那些额外的
控制台。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);
    }
Console.WriteLine(“您希望声音播放多快?”);
Console.WriteLine(“70=快速,300=慢速,可在两者之间选择任意数字”);
字符串选项=Console.ReadLine();
int速度=转换为32(选项);
控制台写入线(速度);
WriteLine(“我应该嘟嘟几声?”);
string choice2=Console.ReadLine();
int j=转换为32(选项2);
控制台。写入(j);
对于(int i=0;i
试试这个:

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

实际上,您所需要做的就是删除您抛出的
Read()
暂停。我可能还会将
Write()
调用更改为
WriteLine()
调用


如果你坚持在那里“暂停”,你也可以将
Read()
调用更改为
ReadLine()
调用。

这是一个奇怪的政策,但这家伙不能用6次代表就把答案投给上。我自己也曾为此挣扎过一段时间。@KevinT奇怪,我从来不知道这一点。哦,好吧,有点。虽然您是正确的,但异常的原因是用户输入错误。。。这很可能是因为必须多次按return键,可能会导致他们为真正重要的
ReadLine
输入一个空字符串。我很快测试了这一点。这就好像
Read()
调用的返回键被直接传递到
ReadLine()
调用中,因此它会立即尝试解析空字符串。这是一种奇怪的行为。