我有一个小方法,可以将字符串分成两部分,检索一个部分,然后使用它建立与服务器的连接:
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]);
之后立即停止。它似乎突破了上面的方法,没有给出警告或其他任何内容。我已经在每一行上使用断点对其进行了测试。它只是简单地停止运行该方法,然后继续执行它所执行的任何操作,常常使应用程序稍后崩溃(因为它需要该值)。这是怎么回事?
答案 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
方法。