【问题标题】:C# Exception handling, stop the loop temporarilyC#异常处理,暂时停止循环
【发布时间】:2021-03-08 04:43:52
【问题描述】:

我是 C# 新手,我真的需要你的帮助来完成一个项目。

这个想法是向用户询问 1-20 之间的 10 个数字。用户输入的数字存储在一个数组中。在下一阶段,我生成了一个随机数,然后程序将用户之前输入的所有数字与随机数进行比较。如果其中一个数字与程序匹配,则写下“你赢了!”之类的内容。

我当前的解决方案还可以,但我想要一个比当前解决方案更好的异常处理。这是我的问题:

正如您在下面的代码中看到的那样,我依靠循环和 try/catch 来确保用户输入有效数字,但经过多次测试,我发现如果您输入有效输入,假设第一次但不是第二个,无效的输入仍然被发送到 for 循环和下一个索引。 我想确保用户输入一个有效的数字,如果不是,for循环会暂时“暂停”,直到输入下一个有效的数字。

bool start = true; //Create a loop.
            {
                while (start == true)
                {
                    try
                    {
                        for (int x = 0; x < vektor.Length; x++) //To fill my array.
                        {
                            Console.WriteLine("Enter a number between 1 and 20:");
                            vektor[x] = int.Parse(Console.ReadLine());
                            start = false;
                        }
                        
                    }

                    catch
                    {
                        Console.WriteLine("Error, you need to enter a number!");
                    }
                }

                
            }

【问题讨论】:

  • 使用int.TryParse(),你不需要异常处理——只要看看TryParse()是返回true还是false并做出相应的响应。
  • 谢谢!我也会看看那个解决方案!

标签: c# arrays for-loop exception try-catch


【解决方案1】:

创建一个向用户提出问题并且在其有效之前不给出答案的方法:

public int Ask(string question, int lower, int upper){


    while(true)
    {
      Console.WriteLine(question);
      string input = Console.ReadLine();
      bool valid = int.TryParse(input, out int inputInt); //valid is true if it was a number
      
      valid = valid && inputInt >= lower && inputInt <= upper; //but also test was it in range?

      if(valid)
        return inputInt;  //if not valid, repeat the question because the loop is infinite
    }

}

如果用户输入一个数字,valid 将为真,但如果他们输入 40 表示 1 到 20 的范围,那么第二个有效性评估是:

valid = true /*it was a number*/ && true /*40 is >= 1*/ && false /*40 is not <= 20*/

所以有效变成了假。我们只能转义 Ask() 方法,如果valid 为真则返回有效数字,否则循环再次循环

--

现在你可以有一个数字列表,比如你想要 10,我们可以循环并将数字添加到列表中,直到我们得到 10:

List<int> numbers = new List<int>();

while(numbers.Count < 10)
{
  int validNumber = Ask("Enter a nubmer between 1 and 20: ", 1, 20);
  numbers.Add(validNumber);
}

如果你愿意,你可以把它作为一个数组来做:

int[] numbers = new int[10];

for(int x = 0; x<numbers.length; x++)
{
  int validNumber = Ask("Enter a nubmer between 1 and 20: ", 1, 20);
  numbers[x] = validNumber;
}

因为你知道 Ask 方法永远不会返回,除非输入有效,所以循环“暂停”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多