Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Да, это, конечно, возможно. Необходимо будет записать интерфейсный слой в C++, который объявляет функции с extern "C"
:
extern "C" int foo(char *bar)
{
return realFoo(std::string(bar));
}
Затем Вы будете звонить foo()
от Вашего модуля C, который передаст запрос эти realFoo()
функция, которая реализована в C++.
, Если необходимо представить полный класс C++ с элементами данных и методами, тогда Вы, возможно, должны сделать больше работы, чем этот простой функциональный пример.
Облегченный FAQ C++: , "Как смешать C и C++, кодируют" .
Некоторые глюки описаны в ответах на эти вопросы:
Основной глюк: исключения не могут быть пойманы в C. Если существует, возможность исключения, повышающегося в коде C++, или, пишет Ваш код C или Ваши обертки C++ очень тщательно. С другой стороны исключение как механизмы (т.е. longjump) в коде C (как найдено в различных языках сценариев) не требуется, чтобы вызывать деструкторы для объектов C++ на стеке.
можно смешать код C/C++. Если Ваше основное () функционирует в в C++, то просто необходимо удостовериться, что функции c объявляются
extern "C"
, Если основное является C, то Вы, вероятно, в порядке за исключением статических переменных. Любых конструкторов с Вашими статическими переменными, как предполагается, вызывают, прежде чем основной () запустятся. Этого не произойдет, если C будет Вашим основным. Я, которого у Вас есть много статических переменных, лучшая вещь сделать, должен заменить статические переменные одиночными элементами.