NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Я попытался установить CMAKE_C_FLAGS
blockquote>Согласно документации ,
CMAKE_C_FLAGS
установил флаги языка C для всех типов сборки . Для C ++ вам нужно использоватьCMAKE_CXX_FLAGS
вместо:set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
Для CMake 3.1 или более поздней версии вы можете установить переменную CMAKE_CXX_STANDARD
на 11
:
Значение по умолчанию для свойства
CXX_STANDARD
целевых объектов.Эта переменная используется для инициализации свойства
blockquote>CXX_STANDARD
для всех целей.Стандарт C ++, чьи функции запрашиваются для создания этой цели.
Это свойство указывает стандарт C ++, чьи функции запрашиваются для создания этой цели. Для некоторых компиляторов это приводит к добавлению в строку компиляции флага типа
-std=gnu++11
.Поддерживаемые значения: 98, 11 и 14.
Если запрашиваемое значение не приводит к при добавлении флага компиляции для используемого компилятора вместо этого будет добавлен предыдущий стандартный флаг. Это означает, что использование:
set_property(TARGET tgt PROPERTY CXX_STANDARD 11)
с компилятором, который не поддерживает
-std=gnu++11
или эквивалентный флаг, не приведет к ошибке или предупреждению, но вместо этого добавит флаг-std=gnu++98
, если он поддерживается. Это поведение «распада» можно контролировать с помощью целевого свойстваCXX_STANDARD_REQUIRED
.См. Руководство cmake-compile-features (7) для получения информации на компилируемых функциях.
Это свойство инициализируется значением переменной
blockquote>CMAKE_CXX_STANDARD
, если оно задано при создании цели.
-std=c++11
, а не -std=gnu++11
, как CXX_STANDARD 11
различает эти два?
– Ela782
3 November 2015 в 22:08
CMAKE_CXX_FLAGS
? Я не слишком хорошо знаком с CMake. – hlin117 10 January 2015 в 17:56set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
второйCMAKE_CXX_FLAGS
должен быть инициализирован до его ссылки (используя$
), но где он инициализирован? (Я не могу представить, что переменная инициализируется и ссылается на одну и ту же строку.) – hlin117 10 January 2015 в 18:12-std=c++14
, но он не работает. Есть идеи? – becko 24 July 2015 в 20:34