Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Там хороший трюк, который делает именно то, что вам нужно. Это основано на идее, которую я нашел в модуле git-revision @rpavlik , см. Это так: вопрос
. Это общая идея:
.pri
изменяется CMakeLists.txt
Возможная реализация:
set(input_pri_file <path-to-the-input-pri-file>)
set(timestamp_file ${CMAKE_CURRENT_BINARY_DIR}/timestamp.cmake)
add_custom_command(
OUTPUT ${timestamp_file}
COMMAND ${CMAKE_COMMAND} -E touch ${timestamp_file}
MAIN_DEPENDENCY ${input_pri_file}
VERBATIM
COMMENT "Updating timestamp.cmake"
)
if(NOT EXISTS "${timestamp_file}")
file(WRITE ${timestamp_file} "") # create initial empty file
endif()
include(${timestamp_file})
# create the file list from input_pri_file
....
# use the file list
add_executable(main ${filelist})
Вот что происходит при изменении файла .pri
:
CMakeLists
включает в себя временную метку, которая зависит от нее CMakeLists.txt
Я использую configure_file () , если у меня есть некоторый ввод, который должен перезапустить процесс настройки CMake. См. Как сделать реконфигурирование CMake зависимым от пользовательского файла? и unit_file () unit test
Так что в вашем случае это будет выглядеть примерно так:
configure_file(SomeInput.pri ${CMAKE_CURRENT_BINARY_DIR}/SomeInput.pri)
Затем вы используете ${CMAKE_CURRENT_BINARY_DIR}/SomeInput.pri
для генерации источников. Просто убедитесь, что вы не добавили COPYONLY
, потому что тогда конфигурация не будет перезапускаться при изменениях SomeInput.pri
.
EDIT: Альтернативно использовать - относительное новое дополнение - CMAKE_CONFIGURE_DEPENDS
.