【问题标题】:Console.ReadLine activating prematurelyConsole.ReadLine 过早激活
【发布时间】:2017-01-05 19:09:35
【问题描述】:

我已经尝试了几十次,但我似乎无法理解为什么这条线会执行?

Console.WriteLine("请输入一个数字。");

甚至在我输入任何字符作为输入之前,它就出现在屏幕上。 任何帮助表示赞赏

int numberAsInt;
while (true) {
    try {
        numberAsInt = Convert.ToInt32(Console.ReadLine());
        break;
    }
    catch {
        Console.WriteLine("please enter a number.");
    }
}

【问题讨论】:

  • 请提供minimal reproducible example(你有)和重现问题所需的数据 - 显然你正在读取你不期望的值 - 调试应该会显示它(通常你会先读入变量,这样更容易看到确切的值......)
  • 我不同意反对票。这个问题有一切需要 - 我也很困惑为什么在我的机器上工作得很好......
  • 启动程序后有没有按任何键?
  • 正如其他人所说的调试问题。在转换前加上string enteredValue = Console.ReadLine();,调试一下你输入的是不是真的是数字,然后试试转换。如果提供的值确实是数字,则您的代码可以正常工作。
  • 请使用catch子句打印出异常信息,然后发布异常信息。还请将控制台的输入捕获到字符串变量中,并使用调试器找出该变量的值

标签: c#


【解决方案1】:

触发catch块的原因是有一个异常引起:

Convert.ToInt32(Console.ReadLine())

ReadLine() 方法将读取您已经输入的任何内容——即使没有任何内容。来自MSDN:

[返回] 输入流中的下一行字符,如果没有更多行可用,则返回 null。

如果标准输入设备是键盘,则 ReadLine 方法会阻塞,直到用户按下 Enter 键。

【讨论】:

  • 能够在我的机器上复制并验证此答案。干得好。
【解决方案2】:

您不应该使用 try/catch 来检查您的输入。更好的方法:

int numberAsInt;
while (true) {
    String str = Console.ReadLine();
    if (int.TryParse(str, out numberAsInt)) {
        break;
    }
    Console.WriteLine("please enter a number.");
}

【讨论】:

    【解决方案3】:

    不需要无限的while 循环和try/catch 块来验证用户输入的数字是否有效,您可以改用int.TryParse()。

    int num;
    string input = "";
    
    while (!int.TryParse(input, out num))
    {
        Console.Write("Enter a number:");
        input = Console.ReadLine();
    }
    
    Console.WriteLine("Number entered:" + num);
    

    【讨论】:

      【解决方案4】:

      捎带Emerson Chen's answer,原因是因为 Console.Readline 会从控制台拉回信息......它在你的代码逻辑之外运行。

      这意味着它不会等到您输入Console.Readline() 才能获得输入。听起来它不应该发生在同步的代码中?好吧,这样想吧:不管你告诉与否,控制台都会继续工作。

      这里有一个可能出错的简单示例。您向控制台写入一条消息,告诉用户让手远离键盘:

      Console.WriteLine("Please don't type anything for 2 seconds.");
      

      很好。现在用户不会搞砸任何事情,您可以在 2 秒内完成您的工作,无需用户输入:

      var startTime = DateTime.Now;
      
      while (DateTime.Now < startTime.AddSeconds(2)) ;
      

      好的,现在我们准备好接受一些输入了:

      Console.WriteLine("Please enter a value.");
      var inputVal = Console.ReadLine();
      
      Console.WriteLine("The value entered was: " + inputVal);
      

      效果很好。但是等一下,如果 Johnny User 忽略警告并输入“100”然后在 2 秒内按下“Enter”键怎么办?在这种情况下,它会被控制台记录下来,并在到达该行代码时尽职尽责地传递给Console.ReadLine()...在用户输入之后。

      【讨论】:

        猜你喜欢
        • 2013-03-04
        • 2010-12-14
        • 1970-01-01
        • 2012-01-01
        • 2011-08-26
        • 2017-08-11
        • 2015-01-05
        • 1970-01-01
        相关资源
        最近更新 更多