Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Для Вашего второго #define необходимо использовать # оператор препроцессора, как это:
#define myDefine(a) myFunc(a, #a);
, Который преобразовывает аргумент строке.
Вот хороший способ объявить список имени:
#define FOR_ALL_FUNCTIONS(F)\
F(NameOne)\
F(NameTwo)\
F(NameThree)\
#define DECLARE_FUNCTION(N)\
void N();
#define IMPLEMENT_FUNCTION(N)\
void N(){}
FOR_ALL_FUNCTIONS(DECLARE_FUNCTION);
FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION);
Этот путь этот список имени может быть снова использован многократно. Я использовал его для разработки прототипа новых функций языка, хотя никогда не закончено с помощью них. Так, если ничто иное, они были отличным способом найти тупики в собственных изобретениях. Интересно, ли это потому что, что они говорят: "макросы плохи"...:)