Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当值太大时,C#代码从方法中返回_C# - Fatal编程技术网

当值太大时,C#代码从方法中返回

当值太大时,C#代码从方法中返回,c#,C#,我得到了一个小方法,它将字符串分成两部分,检索一部分并使用它建立到服务器的连接: private void RetrieveData(string vesselCode) { string[] splitSelectedVessel = vesselCode.Split('_'); int selectedVessel = int.Parse(splitSelectedVessel[1]); // URL of server to retrieve data.

我得到了一个小方法,它将字符串分成两部分,检索一部分并使用它建立到服务器的连接:

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);

}
private void RetrieveData(字符串vesselCode)
{
字符串[]splitSelectedVessel=vesselCode.Split(“”“);
int-selectedvasser=int.Parse(splitselectedvasser[1]);
//用于检索数据的服务器的URL。
//用vesselCode构造。
字符串baseUrl=“…/vehicle/”;
字符串jsonUrl=baseUrl+selectedVesser;
PtVehicle CurrentVesser=下载并反序列化(jsonUrl);
}
VesselCode包含两个部分,中间有一个“uu”:

  • 公司代码
  • 容器号
这两个字段都是来自Xamarin项目的输入字段,最初存储为字符串


每当VesselNumber部分变得太大时,它就在
int-selectedVesser=int.Parse(splitselectedVesser[1])之后停止。它似乎打破了上述方法,没有发出警告或任何东西。我在每一行上都测试了断点。它只是停止运行该方法,继续执行它正在执行的任何操作,经常让应用程序在稍后崩溃(因为它需要该值)。这里发生了什么事?

我想你的号码对于
int
来说太长了。我不知道最大数字是多少,但你可以试试
long
。可能够了

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

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

这里发生的是您正在抛出一个异常。考虑下面的代码…

        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.

如果数字太大而无法解析为int,它应该抛出一个
System.OverflowException
。 根据
long
/
ulong
的范围最大

如果您使用的是Visual Studio,则可能禁用了异常中断功能,因此您可能希望使它们能够查看实际问题是什么
Debug->Windows->Exception Settings
,并确保选中公共语言运行时异常


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

我最终通过@Ilya Chernomordik和@Mihai提供的文档解决了这个问题

问题是
int-selectedvasser=int.Parse(splitselectedvasser[1])将该字符串的值解析为int。当该值大于int max size时,它崩溃。由于VesselNumber是一个ID,我不必计算它,我只需将它存储为字符串即可解决它:

string selectedVessel = splitSelectedVessel[1];

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

现在是开始使用C#异常处理的时候了!!另外
string jsonUrl=baseUrl+selectedVessel看起来可疑。输入到操作数的不同类型
+
需要多长时间?获取数字部分可能在
int.Parse(SplitSelectedVesser[1])中引发异常如果超出int范围,但在拆分行上必须没有问题。无论所用填充的数字有多大,都没有上限。@sjsam I重新构造了一点,将SelectedVesser解析为字符串(也修复了该问题)。将
字符串jsonUrl=baseUrl+selectedVesser这样仍然是坏代码吗?c#中的最大int是2147483647。请尝试长时间。这不是一个好的解决方案,有
int.TryParse
可以避免抛出exceptions@IlyaChernomordik这根本不是一个解决办法。我只是简单地回答“这里发生了什么?”这个问题,对,我想这个问题是关于发生了什么:)啊,这很有道理(与MiHai的链接)。这个数字看起来确实太大了,int无法存储。知道了这一点,我通过将其解析为字符串来解决了这个问题(我不需要用它计算任何东西,只需要将它用于连接等等)。