Что делает оператор запятой?

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

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

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 ");
        }
    }
}
40
задан Matt 27 January 2016 в 21:21
поделиться

8 ответов

Оператор запятой применяется, и значение 5 используется для определения истинного/ложного условного выражения.

Это выполнит вздор () и вернет что-то (по-видимому), тогда оператор запятой используется, и 5 будет единственная вещь, которая используется для определения истинного/ложного значения для выражения.

<час>

Примечание, что, оператор мог быть перегружен для типа возврата вздора () функция (который не был определен), делая результат неочевидным.

66
ответ дан Joel Coehoorn 27 November 2019 в 01:03
поделиться

Я знаю одну вещь, которую должен сделать этот вид кода: это должно уволить кодер. Я довольно немного боялся бы работать рядом с кем-то, кто пишет как это.

20
ответ дан 27 November 2019 в 01:03
поделиться

Если оператор запятой не перегружается, код подобен этому:

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 для комментария этого)

45
ответ дан jop 27 November 2019 в 01:03
поделиться

В патологическом случае это зависит от того, что делает оператор запятой...

class PlaceHolder
{
};

PlaceHolder Blah() { return PlaceHolder(); }

bool operator,(PlaceHolder, int) { return false; }

if (Blah(), 5)
{
    cout << "This will never run.";
}
13
ответ дан Eclipse 27 November 2019 в 01:03
поделиться

Я сказал бы, что это зависит от вздора ().

1
ответ дан Ben Hoffstein 27 November 2019 в 01:03
поделиться

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

Поэтому, если Вы имеете (нечто (), панель ()) Обе функции будут выполняться, но значение выражения оценивает к панели () (и тип выражения также).

, В то время как я не скажу, существуют справедливые использования, для которых, обычно считается немного твердым считать код. Главным образом, потому что не много языков совместно использует такие конструкции. Таким образом, как персональное эмпирическое правило я избегаю его, если я не добавляю код к предсуществующему выражению и не хочу изменять полностью его формат.

Пример: у Меня есть Макрос (не обсуждение, если необходимо использовать макросы или нет, иногда даже Вы, которые записали его)

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))

1
ответ дан OldMan 27 November 2019 в 01:03
поделиться

Я иногда использую конструкции как это для отладки целей. Когда я вызываю если близко к быть верным независимо от возвращаемого значения вздора. Очевидно, что это никогда не должно появляться в производственном коде.

0
ответ дан 27 November 2019 в 01:03
поделиться

Следующее было записано, предположив, что это - код C, или в файле C или в блоке C файла C++:

Это - бессмысленное если . Это назовет вздор (), однако результат вздора () не рассматривают если вообще. Единственная вещь, которую рассматривают, равняется 5, таким образом, если будет всегда оценивать к истинному. IOW Вы могли записать этот код как

blah();
// do something

без любого если вообще.

0
ответ дан Mecki 27 November 2019 в 01:03
поделиться