值太大时,C#代码将退出方法

时间:2019-04-07 14:51:33

标签: c#

我有一个小方法,可以将字符串分成两部分,检索一个部分,然后使用它建立与服务器的连接:

private void RetrieveData(string vesselCode)
{
    string[] splitSelectedVessel = vesselCode.Split('_');
    int selectedVessel = int.Parse(splitSelectedVessel[1]);

    // URL of server to retrieve data.
    // constructed with vesselCode.
    string baseUrl = ".../vehicle/";
    string jsonUrl = baseUrl + selectedVessel;

    PtVehicle currentVessel = DownloadAndDeserialize<PtVehicle>(jsonUrl);

}

VesselCode包含两部分,中间有一个'_':

  • 公司代码
  • 船只编号

两者都是Xamarin项目的输入字段,最初存储为字符串。

每当VesselNumber部分变大时,它就在int selectedVessel = int.Parse(splitSelectedVessel[1]);之后立即停止。它似乎突破了上面的方法,没有给出警告或其他任何内容。我已经在每一行上使用断点对其进行了测试。它只是简单地停止运行该方法,然后继续执行它所执行的任何操作,常常使应用程序稍后崩溃(因为它需要该值)。这是怎么回事?

4 个答案:

答案 0 :(得分:2)

我想您的电话号码对int来说太长了。我不知道最大数量是多少,但是您可以尝试使用long。可能就足够了。

如果不是,则必须处理太大的数字。你可以写

if (long.TryParse(myString, out myValue)
{
   // Your logic here
}
else
{
   // Do something if the value is too large
}

答案 1 :(得分:1)

我最终用@Ilya Chernomordik's和@Mihai提供的文档解决了这个问题。

问题是int selectedVessel = int.Parse(splitSelectedVessel[1]);将该字符串的值解析为int。当该值大于int max大小时,它崩溃了。由于VesselNumber是ID,并且我不必计算它,因此我只需将其存储为字符串来解决它:

string selectedVessel = splitSelectedVessel[1];

另一种方法是将其存储为64位的长整数(整数),但这只会将问题“移动”到更大的数量。

答案 2 :(得分:0)

这里发生的事情是您引发了异常。考虑下面的代码...

        try
        {
            string s1 = "2147483649";
            int j = int.Parse(s1);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

2147483649是int.MaxValue + 1

此代码生成以下消息:

Value was either too large or too small for an Int32.

答案 3 :(得分:0)

如果该数字太大而无法解析为int,则应该抛出System.OverflowException。 根据{{​​3}} long / ulong具有最大的范围。

如果您使用的是Visual Studio,则可能已经禁用了打破例外的功能,因此您可能希望使他们了解实际的问题Debug->Windows->Exception Settings,并确保选中了公共语言运行时例外。

另一方面,最佳做法是在转换为整数类型时使用.TryParse方法。