Ошибка: строка ввода не была в правильном формате [дубликат]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
54
задан Ian R. O'Brien 11 October 2013 в 15:50
поделиться

8 ответов

Ошибка означает, что строка, которую вы пытаетесь разобрать целое число, фактически не содержит допустимого целого числа.

Крайне маловероятно, что текстовые поля будут содержать действительное целое число сразу, когда форма - это то, где вы получаете целые значения. Было бы гораздо разумнее обновить a и b в событиях нажатия кнопки (так же, как вы находитесь в конструкторе). Кроме того, проверьте метод Int.TryParse - его гораздо проще использовать, если строка может не содержать целого числа - она ​​не генерирует исключение, поэтому его легче восстановить.

82
ответ дан Jon 20 August 2018 в 09:10
поделиться
  • 1
    Это сообщение об ошибке может быть также использовано при попытке конвертировать. ToDouble ввод, поступающий от пользователя с другой культуинфой, поэтому вы можете использовать Convert.ToDouble (String, IFormatProvider), а не просто Convert.ToDouble (String). Сложно отлаживать, потому что программа будет работать на вас, но будет вызывать ошибку для некоторых из ее пользователей, поэтому у меня есть метод для регистрации ошибок на моем сервере, и я быстро обнаружил проблему. – vinsa 7 April 2018 в 14:24

это тоже моя проблема .. в моем случае я изменил номер PERSIAN на номер LATIN, и он сработал. И также trime ваша строка перед преобразованием.

PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());
0
ответ дан afshin 20 August 2018 в 09:10
поделиться

У меня была аналогичная проблема, которую я решил с помощью следующей техники:

Исключение было выбрано в следующей строке кода (см. текст, украшенный ** ниже):

static void Main(string[] args)
    {

        double number = 0;
        string numberStr = string.Format("{0:C2}", 100);

        **number = Double.Parse(numberStr);**

        Console.WriteLine("The number is {0}", number);
    }

После небольшого исследования я понял, что проблема заключалась в том, что форматированная строка включала знак доллара ($), который методы Parse / TryParse не могут решить (т. е. отключить). Поэтому, используя метод Remove (...) строкового объекта, я изменил строку на:

number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number

. В этот момент метод Parse (...) работал как ожидалось.

0
ответ дан astevens009 20 August 2018 в 09:10
поделиться

Проблемы

Возможны случаи, когда возникает ошибка:

  1. Поскольку textBox1.Text содержит только число, но число слишком велико / слишком small
  2. Поскольку textBox1.Text содержит: a) не число (кроме space в начале / конце, - в начале) и / или b) тысячи разделителей в прикладную культуру для вашего кода, не указав NumberStyles.AllowThousands, или указав NumberStyles.AllowThousands, но поместив неправильный thousand separator в культуру и / или c) десятичный разделитель (который не должен существовать в разборке int)

NOT OK Примеры:

Случай 1

a = Int32.Parse("5000000000"); //5 billions, too large
b = Int32.Parse("-5000000000"); //-5 billions, too small
//The limit for int (32-bit integer) is only from -2,147,483,648 to 2,147,483,647

Случай 2 a)

a = Int32.Parse("a189"); //having a 
a = Int32.Parse("1-89"); //having - but not in the beginning
a = Int32.Parse("18 9"); //having space, but not in the beginning or end

Случай 2 b)

NumberStyles styles = NumberStyles.AllowThousands;
a = Int32.Parse("1,189"); //not OK, no NumberStyles.AllowThousands
b = Int32.Parse("1,189", styles, new CultureInfo("fr-FR")); //not OK, having NumberStyles.AllowThousands but the culture specified use different thousand separator

Случай 2 c)

NumberStyles styles = NumberStyles.AllowDecimalPoint;
a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all!

Похоже, что НЕ ОК, но на самом деле ОК Примеры:

Случай 2 a) OK

a = Int32.Parse("-189"); //having - but in the beginning
b = Int32.Parse(" 189 "); //having space, but in the beginning or end

Случай 2 b) OK

NumberStyles styles = NumberStyles.AllowThousands;
a = Int32.Parse("1,189", styles); //ok, having NumberStyles.AllowThousands in the correct culture
b = Int32.Parse("1 189", styles, new CultureInfo("fr-FR")); //ok, having NumberStyles.AllowThousands and correct thousand separator is used for "fr-FR" culture

Решения

Во всех случаях проверьте значение textBox1.Text с помощью отладчика Visual Studio и убедитесь, что он имеет чисто приемлемый численный формат для диапазона int. Что-то вроде этого:

1234

Также вы можете рассмотреть

  1. , используя TryParse вместо Parse, чтобы убедиться, что не проанализированный номер не вызывает вы исключили проблему.
  2. проверить результат TryParse и обработать его, если не true
    int val;
    bool result = int.TryParse(textbox1.Text, out val);
    if (!result)
        return; //something has gone wrong
    //OK, continue using val
    
4
ответ дан Community 20 August 2018 в 09:10
поделиться

Я столкнулся с этим единственным исключением, за исключением того, что он не имел никакого отношения к анализу числовых входов. Так что это не ответ на вопрос OP, но я думаю, что это приемлемо для обмена знаниями.

Я объявил строку и форматировал ее для использования с JQTree для которого требуются фигурные скобки ({}). Вы должны использовать удвоенные фигурные скобки, чтобы он принимался как правильно отформатированная строка:

string measurements = string.empty;
measurements += string.Format(@"
    {{label: 'Measurement Name: {0}',
        children: [
            {{label: 'Measured Value: {1}'}},
            {{label: 'Min: {2}'}},
            {{label: 'Max: {3}'}},
            {{label: 'Measured String: {4}'}},
            {{label: 'Expected String: {5}'}},
        ]
    }},",
    drv["MeasurementName"] == null ? "NULL" : drv["MeasurementName"],
    drv["MeasuredValue"] == null ? "NULL" : drv["MeasuredValue"],
    drv["Min"] == null ? "NULL" : drv["Min"],
    drv["Max"] == null ? "NULL" : drv["Max"],
    drv["MeasuredString"] == null ? "NULL" : drv["MeasuredString"],
    drv["ExpectedString"] == null ? "NULL" : drv["ExpectedString"]);

Надеюсь, это поможет другим людям, которые находят этот вопрос, но не анализируют числовые данные.

39
ответ дан delliottg 20 August 2018 в 09:10
поделиться

Вы не указали, имеют ли ваши текстовые поля значения во время разработки или сейчас. Когда форма инициализирует текстовое поле, может не иметь значения, если вы не поместили его в текстовое поле, когда во время проектирования формы. вы можете поместить значение int в конструкцию формы, установив свойство text в desgin, и это должно работать.

3
ответ дан Kirtan Pandya 20 August 2018 в 09:10
поделиться

Если вы явно не проверяете числа в текстовом поле, в любом случае лучше использовать

int result=0;
if(int.TryParse(textBox1.Text,out result))

. Теперь, если результат будет успешным, вы можете продолжить свои вычисления.

14
ответ дан V4Vendetta 20 August 2018 в 09:10
поделиться

В моем случае я забыл положить двойную фигурную скобку, чтобы убежать. {{MyObject}}

1
ответ дан zawhtut 20 August 2018 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: