当值太大时,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”:
- 公司代码
- 容器号
每当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无法存储。知道了这一点,我通过将其解析为字符串来解决了这个问题(我不需要用它计算任何东西,只需要将它用于连接等等)。