如何防止程序从无效输入中崩溃

时间:2014-11-23 21:34:10

标签: c#

我创建了一个玩家类,并为我的菜单驱动的播放器系统制作了一个数组,我试图验证用户输入。我创建了一个GetChar和一个GetInt方法来检查用户是否已经使用了char和Int但是我不确定如何验证用户是否已经为玩家号码,目标和助手提供了一个正数而不是负数。

任何帮助将不胜感激

//Creates a player in the tables if the array is not already full and the name is not a duplicate
    static void ProcessCreate(Int32 number, String firstName, String lastName, Int32 goals,
        Int32 assists, Player[] players, ref Int32 playerCount, Int32 MAXPLAYERS)

    {
        string message;
        //Int32 player = 0;
        if (playerCount < MAXPLAYERS)
        {
           message =("\nCreate Player: please enter the player's number");
           number = IOConsole.GetInt32(message);
       //(Console.ReadLine());
            if (GetPlayerIndex(number, firstName, lastName, goals, assists, players, ref playerCount) == -1)
            {
                message =("\nCreate Player: please enter the player's First Name");
                firstName = IOConsole.Getstring(message);
                  //Console.ReadLine();
                message = ("\nCreate Player: please enter the player's Last  Name");
                lastName = IOConsole.Getstring(message);
                 //Console.ReadLine();
                message =("\nCreate Player: please enter the player's goals");
                goals = IOConsole.GetInt32(message);
               //Int32.Parse(Console.ReadLine());
             message =("\nCreate Player: please enter the player's assists");
             assists = IOConsole.GetInt32(message);
                 //Console.ReadLine();
                InsertPlayer(number, firstName, lastName, goals, assists, players, ref playerCount);
                Console.WriteLine("\n{0,7}   {1,-20}{2, -20}{3,8}{4,8}{5,8}\n", "Number", "First Name", "Last Name", "Goals", " Assists", "Points");
                for (Int32 player = 0; player < playerCount; player++)
                Console.WriteLine("{0,7}   {1,-20}{2, -20}{3,8}{4,8}{5,8}",
              players[player].Number, players[player].FirstName, players[player].LastName,
              players[player].Goals, players[player].Assists, players[player].Points());


                Console.WriteLine();
            }
            else
                Console.WriteLine("\nCreate Player: the player number already exists");
        }
        else
            Console.WriteLine("\nCreate Player: the player roster is already full");

    }

2 个答案:

答案 0 :(得分:2)

从正确的数据类型开始 - 如果您使用不能的类型为负数,那么您就已经领先了。

所以 - 您可以使用byteushortuintulong,具体取决于您的模型(最多8位玩家 - 使用{{1} })。

用户输入这些值的方式尚不清楚 - 如果程序员使用您的图书馆,上述内容将大大有助于确保根据您的意愿进行操作。

如果这些是用户输入的文本(例如,在UI或命令行上),则需要解析这些值 - .NET框架在所有上提供byteParse整数类型(如上面的那些)。这些将允许您根据验证规则检查用户输入的值是否有效。

如果你有一个更复杂的用户界面,选择正确类型的用户界面元素可以确保这些问题永远不会出现(例如,玩家数量的单选按钮,其中值完全在你的控制之中) - 不说这个是一个很棒的用户界面,只要你有选项和控件)。

检查这些并向用户返回错误是很正常的。


如果你是&#34;卡住&#34;对于已签名的类型(即,可以具有负值),只需检查0:

的值
TryParse

作为一个注释 - 如果你不能验证输入,那么崩溃无效输入可能是一件好事。

答案 1 :(得分:0)

只需使用简单的while while循环。获取用户输入,然后检查该值是否小于0.如果小于0,则输入该值。

do
{
    // get user input
} while(message < 0);