Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Если Вы будете смотреть на MSIL, поскольку он выполняется, Вы будете видеть, что он не компилирует вниз в тот же самый код. При использовании IsNothing (), он на самом деле звонит тому методу в противоположность просто оценке выражения.
причина я был бы склонен склоняться к использованию, "Ничто", когда я инвертирую его, становится "IsNot Ничто', а не "Не IsNothing (объект)", который я лично чувствую более читаемые взгляды.
Я нахожу, что Patrick Steele ответил на этот вопрос лучше всего на его блоге: Предотвращение IsNothing ()
я не скопировал ни одного его ответа здесь, для обеспечения кредита get's Patrick Steele на его сообщение. Но я действительно думаю, пытаетесь ли Вы решить, использовать ли, Ничто или IsNothing, необходимо прочитать его сообщение. Я думаю, что Вы согласитесь, что это - Ничто, лучший выбор.
Редактирование - комментарий VoteCoffe здесь
содержание статьи Partial: После рассмотрения большего количества кода я узнал другую причину, необходимо избежать этого: Это принимает типы значения! Очевидно, так как IsNothing () является функцией, которая принимает 'объект', можно передать что-либо, что Вы хотите к нему. Если это будет тип значения, то.NET втиснет его в объект и передаст его IsNothing - который будет всегда возвращать false на помещенном в коробку значении! Компилятор VB.NET проверит, ", Ничто" не разрабатывает синтаксис и не скомпилирует, при попытке сделать, "Ничто" на типе значения. Но IsNothing () функционируют компиляции без жалоб.-PSteele †“VoteCoffee
Я соглашаюсь с, "Ничто". Как указано выше легко Ничего не инвертировать с "IsNot".
я нахожу это легче читать...
If printDialog IsNot Nothing Then
'blah
End If
, чем это...
If Not obj Is Nothing Then
'blah
End If
VB полон вещей как эта попытка сделать его и "как английский язык" и удобный для людей, которые привыкли к языкам, которые используют () и {} много. Например, на "как английская "сторона... VB имеет" , Не " ключевое слово... и не, я не шучу. И с другой стороны, поскольку Вы уже, вероятно, знаете большую часть времени, что можно использовать () с вызовами функции, если Вы хотите, но не имеете к.
я предпочитаю IsNothing ()..., но я использую C и C#, таким образом, это, что удобно. И я думаю, что это более читаемо. Но пойдите с тем, что чувствует себя более комфортно Вам.
Я склоняюсь к, "Ничто" альтернатива, прежде всего, потому что это кажется большим количеством OO.
, Конечно, Visual Basic не , получил не ключевое слово.
Я также склонен использовать Ничего версия частично от использования его так же, как я делаю в SQL.
Я первоначально использовал IsNothing, но я двигал использование, Ничто в более новых проектах, главным образом для удобочитаемости. Единственное время, которое я продолжаю работать с IsNothing, - то, если я поддерживаю код, где это используется повсюду, и я хочу остаться последовательным.