Я получаю исключение нулевого указателя при выполнении макроса для некоторого взаимодействия Java, и я не могу понять, почему.
Я устанавливаю поля Java-объекта, используя карту с вложенными данными, и, поскольку имена ключей карты совпадают с именами полей объекта, я создал макрос:
(defmacro set-keys! [pose m k klst]
`(set! (. ~pose ~(symbol (name k)))
(double-array (map #(% (~(keyword (name k)) ~m)) ~klst))))
Для тестирования я определил pse
как инициализированный объект Java с интересующими полями, установленными на ноль, и определил mp
как упрощенную карту, которая все еще будет работать:
(def mp {:pos {:x 1 :y 2})
Теперь приходит странное поведение. Выполнение set-keys!
с явно типизированными аргументами работает:
user> (set-keys! pse mp :pos [:x :y])
#<double[] [D@691ba57a>
Но если я использую, запустите код внутри let
вызова:
user> (let [x :pos y [:x :y]]
(set-keys! pse mp x y))
Я получаю исключение нулевого указателя с сообщением "Нет сообщения". как сообщение В чем здесь проблема?
EDIT: я определил pse
с помощью (def pse (pose_t.))
, pose_t
- сгенерированный класс, а конструктор pose_t()
инициализирует все массивы в его полях, но не инициализирует значения. Соответствующие строки кода класса для упрощенного примера:
public double pos[];
public pose_t() {
pos = new double[3];
}