Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Оператор запятой применяется, и значение 5 используется для определения истинного/ложного условного выражения.
Это выполнит вздор () и вернет что-то (по-видимому), тогда оператор запятой используется, и 5 будет единственная вещь, которая используется для определения истинного/ложного значения для выражения.
<час>Примечание, что, оператор мог быть перегружен для типа возврата вздора () функция (который не был определен), делая результат неочевидным.
Я знаю одну вещь, которую должен сделать этот вид кода: это должно уволить кодер. Я довольно немного боялся бы работать рядом с кем-то, кто пишет как это.
Если оператор запятой не перегружается, код подобен этому:
blah();
if (5) {
// do something
}
, Если оператор запятой перегружается, результат будет основан на той функции.
#include <iostream>
#include <string>
using namespace std;
string blah()
{
return "blah";
}
bool operator,(const string& key, const int& val) {
return false;
}
int main (int argc, char * const argv[]) {
if (blah(), 5) {
cout << "if block";
} else {
cout << "else block";
}
return 0;
}
(отредактированный для показа сценария перегрузки оператора запятой. благодаря David Pierre для комментария этого)
В патологическом случае это зависит от того, что делает оператор запятой...
class PlaceHolder
{
};
PlaceHolder Blah() { return PlaceHolder(); }
bool operator,(PlaceHolder, int) { return false; }
if (Blah(), 5)
{
cout << "This will never run.";
}
Я сказал бы, что это зависит от вздора ().
На более широком ответе. Оператор запятой (не перегруженный) твердость как в, выполните первую часть и возвратите вторую часть.
Поэтому, если Вы имеете (нечто (), панель ()) Обе функции будут выполняться, но значение выражения оценивает к панели () (и тип выражения также).
, В то время как я не скажу, существуют справедливые использования, для которых, обычно считается немного твердым считать код. Главным образом, потому что не много языков совместно использует такие конструкции. Таким образом, как персональное эмпирическое правило я избегаю его, если я не добавляю код к предсуществующему выражению и не хочу изменять полностью его формат.
Пример: у Меня есть Макрос (не обсуждение, если необходимо использовать макросы или нет, иногда даже Вы, которые записали его)
FIND_SOMETHING (X) (x> 2)? find_fruits (x): find_houses (x)
И я обычно использую его в присвоениях как my_possession = FIND_SOMETHING (34);
Теперь я хочу добавить журнал к нему для отладки целей, но я не могу изменить функции находки. Я мог сделать:
FIND_SOMETHING (X) (x> 2)? (ЖУРНАЛ ("ищущий фрукты"), find_fruits (x)): (ЖУРНАЛ ("ищущий здания"), find_houses (x))
Я иногда использую конструкции как это для отладки целей. Когда я вызываю если близко к быть верным независимо от возвращаемого значения вздора. Очевидно, что это никогда не должно появляться в производственном коде.
Следующее было записано, предположив, что это - код C, или в файле C или в блоке C файла C++:
Это - бессмысленное если . Это назовет вздор (), однако результат вздора () не рассматривают если вообще. Единственная вещь, которую рассматривают, равняется 5, таким образом, если будет всегда оценивать к истинному. IOW Вы могли записать этот код как
blah();
// do something
без любого если вообще.