“Никакая новая строка в конце файла” предупреждение компилятора

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

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

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 ");
        }
    }
}
180
задан Brian Tompsett - 汤莱恩 3 June 2016 в 01:10
поделиться

5 ответов

Думайте о некоторых проблемах, которые могут произойти, если нет никакой новой строки. Согласно стандарту ANSI #include из файла вначале вставляет файл точно, как это к передней стороне файла и не вставляет новую строку после #include <foo.h> после содержания файла. Таким образом, при включении файла без новой строки в конце синтаксическому анализатору, это будет просматриваться, как будто последняя строка foo.h находится на той же строке как первая строка foo.cpp. Что, если последняя строка foo.h была комментарием без новой строки? Теперь первая строка foo.cpp комментируется. Это просто несколько примеров типов проблем, которые могут накопиться.

<час>

Просто хотел указать на любые заинтересованные стороны на ответ James ниже. В то время как вышеупомянутый ответ все еще корректен для C, новый стандарт C++ (C++ 11) был изменен так, чтобы это предупреждение больше не выпускалось при использовании C++ и компилятора, соответствующего C++ 11.

От C++ 11 стандартов с помощью сообщения James:

исходный файл А, который не пуст и это не заканчивается в символе новой строки, или это заканчивается в символе новой строки, которому сразу предшествует символ обратной косой черты, прежде чем любое такое соединение произойдет, буду обработан, как будто дополнительный символ новой строки был добавлен в файл (C++ 11 В§2.2/1).

212
ответ дан JL2210 23 November 2019 в 06:14
поделиться

C++ 03 Стандарта [2.1.1.2] объявляет:

... Если исходный файл, который не пуст, не заканчивается в символе новой строки или заканчивается в символе новой строки, которому сразу предшествует символ обратной косой черты, прежде чем любое такое соединение произойдет, поведение не определено.

24
ответ дан Lightness Races with Monica 23 November 2019 в 06:14
поделиться

Ответ для "послушного", "потому что C++, в 03 Стандартах говорится поведение программы, не заканчивающейся в новой строке, не определен" (перефразируемый).

ответ для любопытного здесь: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html .

15
ответ дан Lightness Races with Monica 23 November 2019 в 06:14
поделиться

Это не относится к пустой строке, именно, завершается ли последняя строка (может иметь содержание в нем) с новой строкой.

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

6
ответ дан Leigh Caldwell 23 November 2019 в 06:14
поделиться

#include заменит его строку литеральным содержанием файла. Если файл не закончится новой строкой, строка, содержащая #include, который сдержался, то это объединится со следующей строкой.

5
ответ дан LogicStuff 23 November 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: