Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Ошибка означает, что строка, которую вы пытаетесь разобрать целое число, фактически не содержит допустимого целого числа.
Крайне маловероятно, что текстовые поля будут содержать действительное целое число сразу, когда форма - это то, где вы получаете целые значения. Было бы гораздо разумнее обновить a
и b
в событиях нажатия кнопки (так же, как вы находитесь в конструкторе). Кроме того, проверьте метод Int.TryParse
- его гораздо проще использовать, если строка может не содержать целого числа - она не генерирует исключение, поэтому его легче восстановить.
это тоже моя проблема .. в моем случае я изменил номер 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());
У меня была аналогичная проблема, которую я решил с помощью следующей техники:
Исключение было выбрано в следующей строке кода (см. текст, украшенный ** ниже):
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 (...) работал как ожидалось.
Проблемы
Возможны случаи, когда возникает ошибка:
textBox1.Text
содержит только число, но число слишком велико / слишком small 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
Также вы можете рассмотреть
TryParse
вместо Parse
, чтобы убедиться, что не проанализированный номер не вызывает вы исключили проблему. TryParse
и обработать его, если не true
int val;
bool result = int.TryParse(textbox1.Text, out val);
if (!result)
return; //something has gone wrong
//OK, continue using val
Я столкнулся с этим единственным исключением, за исключением того, что он не имел никакого отношения к анализу числовых входов. Так что это не ответ на вопрос 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"]);
Надеюсь, это поможет другим людям, которые находят этот вопрос, но не анализируют числовые данные.
Вы не указали, имеют ли ваши текстовые поля значения во время разработки или сейчас. Когда форма инициализирует текстовое поле, может не иметь значения, если вы не поместили его в текстовое поле, когда во время проектирования формы. вы можете поместить значение int в конструкцию формы, установив свойство text в desgin, и это должно работать.
Если вы явно не проверяете числа в текстовом поле, в любом случае лучше использовать
int result=0;
if(int.TryParse(textBox1.Text,out result))
. Теперь, если результат будет успешным, вы можете продолжить свои вычисления.
В моем случае я забыл положить двойную фигурную скобку, чтобы убежать. {{MyObject}}