&引用;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()
调用中,因此它会立即尝试解析空字符串。这是一种奇怪的行为。