【问题标题】:"FormatException" not thrown when ToInt32() method has invalid argument type当 ToInt32() 方法的参数类型无效时,不会引发“FormatException”
【发布时间】:2015-08-05 11:02:19
【问题描述】:

1)

class Program
{
    static void Main(string[] args)
    {
        int a;
        a = Convert.ToInt32( "a" );
        Console.Write(a);
    }
}

我收到FormatException 的消息:Input string was not in a correct format。这个就很好理解了。

2)

class Program
{
    static void Main(string[] args)
    {
        int a;
        a = Convert.ToInt32( Console.Read() );
        Console.Write(a);
    }
}

在第二种情况下,我可以输入任何字符,例如abc,它会显示在控制台中。

问题:为什么在第二种情况下不抛出 FormatException 以及为什么它与非 int 字符一起成功?

更新

使用Console.ReadLine() 方法,返回string 类型,也不会删除FormatException 并成功打印控制台中的任何字符。

class Program
{
    static void Main(string[] args)
    {
        int a;
        a = Convert.ToInt32(Console.ReadLine());
        Console.Write(a);
    }
}

【问题讨论】:

  • 简单的答案,只需在 Visual Studio 中将鼠标悬停在 .Read() 上查看文档或事件的第一行
  • 是的,Console.Read() 返回 int 类型,但是如果使用返回 console.ReadLine() 类型的 console.ReadLine() 方法,此代码也不会抛出异常并且有效
  • "如果使用返回字符串类型的 console.ReadLine() 方法,此代码也不会抛出异常并且可以工作" - 不,那不是真的。显示后一个声明的代码和您的输入。
  • @CodeCaster - 请查看有问题的更新
  • 是的,“输入”是指您输入的内容。 Console.ReadLine() 等待 Enter 键...它打印您键入的字符,但仅在您按 Enter 后返回输入。然后你会得到你的例外。

标签: c# .net console


【解决方案1】:

return type of Console.Read() is an int

然后你拨打Convert.ToInt32(int):

返回指定的 32 位有符号整数;没有执行实际的转换。

【讨论】:

  • 有人在不发表评论的情况下对您的问题和我的问题投反对票!
【解决方案2】:

因为Console.Read() 的输出是int。这意味着它会获得您输入的内容的 int 表示,因此如果您输入字符,它实际上会获得该字符的 int 表示,并且一切正常。

查看详细情况:

int a;
a = Convert.ToInt32(Console.Read());  //input for example: abc
Console.WriteLine(a);                 //97
Console.WriteLine((char)a);           //a

【讨论】:

  • 反对者,考虑发表评论并说出你的理由
【解决方案3】:

返回值类型:System.Int32 输入的下一个字符 流,如果当前没有更多字符,则为负一 (-1) 待读。

public static int Read()

Reference

FormatException:值不包含可选符号后跟数字序列(0 到 9)。

【讨论】:

    【解决方案4】:

    强烈怀疑你正在使用 Console.ReadLineConsole.Read 方法。

    来自Console.Read doc

    从标准输入流中读取下一个字符。

    返回值类型:System.Int32 输入中的下一个字符 流,如果当前没有更多字符,则为负一 (-1) 待读。

    这意味着当您使用此方法输入abc 时,它会返回97 (because 97 is the ascii value of the first character),这是一个有效整数。

    【讨论】:

      【解决方案5】:

      https://msdn.microsoft.com/en-us/library/sf1aw27b(v=vs.110).aspx

      ToInt32 确实有一个可以接受字符串的重载版本,但字符串必须是实数的表示; “a”不是数字,但如果你有“101”,它会正确解析-

      int a;
      a = Convert.ToInt32("101");  //will parse to int
      Console.Write(a);
      
      a = Convert.ToInt32("a");  //will not parse to int
      Console.Write(a);
      

      您的第二个示例有效而第一个无效的原因是因为 Console.Read 根据传入的下一个字符返回 integer 值,所以当您调用 ToInt32 时一切都很好用它。

      更新-

      刚刚也用ReadLine测试过,还是报错。

      【讨论】:

        猜你喜欢
        • 2012-05-30
        • 2021-01-13
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        • 2019-05-14
        • 2023-03-16
        • 2022-07-18
        • 2013-09-22
        相关资源
        最近更新 更多