Другое событие 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));
}
Глупая идея: как насчет:
(defun foo (x)
`(lambda () ,x))
(funcall (foo 10)) ;; => 10
Найденный другим решением с лексически позволенным
(defun foo (n)
(lexical-let ((n n)) #'(lambda() n)))
(funcall (foo 10)) ;; => 10
Я не фирма в Lisp Emacs, но насколько я знаю, большая разница от языка Common LISP - то, что это использует динамический обзор повсюду. Руководство Lisp Emacs указывает, что Lisp Emacs не имеет закрытий.
я попытаюсь применить свои теоретические знания динамического обзора.
, Если у Вас есть функция id
, который просто возвращает значение my-id
:
(defun id () my-id)
и Вы используете его в некоторой другой функции:
(defun some-other-place () (id))
и где-нибудь на пути к вызову id
Вы связываете my-id
через, например, позволенный:
(defun even-elsewhere () (let ((my-id 5)) (some-other-place)))
это должно отдать 5.
я знаю, что динамический обзор является странным зверем, когда Вы привыкли к лексическому обзору, но возможно можно использовать это для реализации желаемого поведения.
Шепелявость Emacs только имеет динамический обзор. Существует lexical-let
макрос, который приближает лексический обзор посредством довольно ужасного взлома.