Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Это было бы равно b
.
оператор запятой имеет более низкий приоритет, чем присвоение.
Оператор запятой имеет самый низкий приоритет всех операторов C/C++. Поэтому это всегда - последнее, которое свяжет с выражением, означая это:
a = b, c;
эквивалентно:
(a = b), c;
Другой интересный факт - то, что оператор запятой представляет точка последовательности . Это означает что выражение:
a+b, c(), d
, как гарантируют, будет иметь его три подвыражения ( a+b, c () и d) оцененный в порядке. Это значительно, если у них есть побочные эффекты. Обычно компиляторам позволяют оценить подвыражения в любом порядке, они находят соответствие; например, в вызове функции:
someFunc(arg1, arg2, arg3)
аргументы могут быть оценены в произвольном порядке. Обратите внимание, что запятые в вызове функции не операторы; они - разделители.
Всего хорошего, чтобы заметить, что оператор запятой может быть перегружен в C++. Фактическое поведение может таким образом очень отличаться от ожидаемого того.
Как пример, Повышение. Дух использование оператор запятой вполне умно для реализации инициализаторов списка для таблиц символов. Таким образом это делает следующий синтаксис возможным и значимым:
keywords = "and", "or", "not", "xor";
Уведомление, что из-за приоритета оператора, код (намеренно!) идентичный
(((keywords = "and"), "or"), "not"), "xor";
таким образом, первый названный оператор keywords.operator =("and")
, который возвращает объект прокси, на который оставление operator,
вызываются с:
keywords.operator =("and").operator ,("or").operator ,("not").operator ,("xor");
Значение a
будет b
, но значение [1 110] выражение будет c
. Таким образом, в
d = (a = b, c);
быть равным b
, и d
был бы равен c
.
значение b будет присвоено a. Ничего не произойдет с c
Значение желания быть равным b, так как оператор запятой имеет более низкий приоритет, чем оператор присваивания.