Код C # возвращает вывод из метода, когда значение слишком велико

#c#

#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 содержит две части, объединенные символом ‘_’ между ними:

  • код компании
  • vesselnumber

Оба имеют поля ввода из проекта Xamarin и изначально хранятся в виде строк.

Всякий раз, когда часть VesselNumber становится слишком большой, она просто останавливается сразу после int selectedVessel = int.Parse(splitSelectedVessel[1]); . Кажется, что он выходит из описанного выше метода, не выдавая предупреждения или чего-либо еще. Я протестировал это с точками останова в каждой строке. Он просто прекращает выполнение этого метода и продолжает делать то, что делал, часто позволяя приложению завершать работу позже (поскольку ему нужно это значение). Что здесь происходит?

Комментарии:

1. Самое время начать использовать обработку исключений C #!! Также string jsonUrl = baseUrl selectedVessel; выглядит подозрительно. Разные типы, передаваемые в операнд

2. как долго? получение числовой части может вызвать исключение int.Parse(splitSelectedVessel[1]); , если она выходит за пределы диапазона int, но не должно вызывать проблем при разделении строки.

3. Числа могут быть сколь угодно большими, используемые заполнения, на это нет ограничения.

4. @sjsam Я немного переработал, чтобы вместо этого разобрать selectedVessel как строку (проблема также исправлена). string jsonUrl = baseUrl selectedVessel; Все равно будет ли таким образом плохой код?

5. максимальное значение int в c # равно 2,147,483,647 ..попробуйте long.

Ответ №1:

Я полагаю, что ваше число слишком длинное для int . Я не знаю, каким может быть максимальное число, но вы можете попробовать long вместо этого. Вероятно, этого достаточно.

Если это не так, то вам нужно что-то сделать с обработкой слишком больших чисел. Вы можете написать

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

Комментарии:

1. Ах, это имеет большой смысл (по ссылке Михая). Действительно, кажется, что число было слишком большим для сохранения в int. Зная это, я исправил проблему, проанализировав его как строку вместо этого (мне не нужно ничего вычислять с ним, просто используя его для подключения и тому подобное).

Ответ №2:

В итоге я исправил проблему с помощью @Ilya Chernomordik и документации, предоставленной @Mihai.

Проблема заключалась в том, что int selectedVessel = int.Parse(splitSelectedVessel[1]); значение этой строки преобразуется в значение int. Когда значение было больше, чем максимальный размер int, произошел сбой. Поскольку VesselNumber — это идентификатор, и мне не нужно его вычислять, я просто решил проблему, сохранив его в виде строки:

 string selectedVessel = splitSelectedVessel[1];
  

Другой способ — сохранить его как long (int) из 64 бит, но это только «переносит» проблему на гораздо большее число.

Ответ №3:

Здесь происходит то, что вы создаете исключение. Рассмотрим следующий код…

         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.
  

Комментарии:

1. Это не очень хорошее решение, есть int.TryParse способ избежать возникновения исключений

2. @IlyaChernomordik это вообще не решение. Я просто отвечаю на вопрос «что здесь происходит?»

3. Верно, я полагаю, вопрос был о том, что происходит 🙂

Ответ №4:

Он должен выдавать System.OverflowException , если число слишком велико, чтобы быть проанализировано как int. Согласно документации Microsoft long / ulong имеет самый большой диапазон.

Возможно, у вас отключена функция прерывания для исключений, если вы используете Visual Studio, поэтому вы можете захотеть включить их, чтобы увидеть, в чем реальная проблема Debug->Windows->Exception Settings , и убедиться, что проверяются исключения Common Language Runtime.

С другой стороны, наилучшей практикой является использование .TryParse подхода при преобразовании в целочисленный тип.