“System.FormatException” when getting user input f

2019-02-26 17:07发布

I am trying to make a command line program that will ask if fast and long you want it to beep. I keep getting System.FormatException on the code below. I get the problem right after Console.WriteLine("how many times should i beep?");. I've found a fix by putting a console.read();//pause right after this line.

My question is what am I doing wrong? or am I suppose to have the pause after that line?

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条回答
The star\"
2楼-- · 2019-02-26 17:45

Actually, all you need to do is remove those Read() pauses you threw in. I'd probably also change the Write() calls to WriteLine() calls.

You can also change the Read() calls to ReadLine() calls, if you insist on "pausing" there.

查看更多
甜甜的少女心
3楼-- · 2019-02-26 17:46

why are those extra Console.Read() in there? They are breaking your program, because the user will press return too many times

    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);
    }
查看更多
狗以群分
4楼-- · 2019-02-26 17:54

Try this:

    Console.Read();
    string choice2 = Console.ReadLine();
查看更多
我欲成王,谁敢阻挡
5楼-- · 2019-02-26 17:58

My psychic debugging skills tell me that it's this line throwing the exception:

int j = Convert.ToInt32(choice2);

Putting the Console.Read() in like you mentioned before that causes that line not to execute immediately and delaying the throwing of the exception.

If you input something that isn't an integer on this line:

string choice2 = Console.ReadLine();

You will get a FormatException on the following Convert.ToInt32 call.

See the documentation for Convert.ToInt32 where it tells you a FormatException is thrown when the value you pass does not consist of an optional sign followed by a sequence of digits (0 through 9).

To solve your issue, use Int32.TryParse (or just make sure you enter a valid integer). That will return a boolean indicating the success or failure of the parsing rather than throwing an exception.

Also, welcome to StackOverflow! Be sure to upvote answers you find helpful and accept the one that best resolves your question.

查看更多
登录 后发表回答