NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Легко оценить выражения Lisp в Нижнем Режиме Emacs-Lisp:
M-x ielm
можно читать больше об этой функции в раздел руководства Emacs по "Взаимодействию Lisp"
Ваш лучший выбор эти *scratch*
буфер. Можно сделать его больше как REPL первым включением отладчика:
M-x set-variable debug-on-error t
Тогда использование C-j
вместо C-x C-e
, который вставит результат оценки выражения в буфер на строке после выражения. Вместо вещей как история команд, * * *
и т.д, Вы просто перемещаетесь эти *scratch*
буфер и редактирование.
, Если Вы хотите, чтобы вещи как * * *
работали, больше как обычный REPL, попытка ielm
.
M-x ielm
В эти *scratch*
буфер, просто введите C-j для оценки выражения перед точкой.
Ну, если Вы действительно интересуетесь литеральным REPL для emacs, возможно записать то с помощью - пакетный режим emacs:
(require 'cl)
(defun read-expression ()
(condition-case
err
(read-string "> ")
(error
(message "Error reading '%s'" form)
(message (format "%s" err)))))
(defun read-expression-from-string (str)
(condition-case
err
(read-from-string str)
(error
(message "Error parsing '%s'" str)
(message (format "%s" err))
nil)))
(defun repl ()
(loop for expr = (read-string "> ") then (read-expression)
do
(let ((form (car (read-expression-from-string expr))))
(condition-case
err
(message " => %s" (eval form))
(error
(message "Error evaluating '%s'" form)
(message (format "%s" err)))))))
(repl)
можно назвать это из командной строки, или, поскольку Вы, кажется, хотите из буфера emacs выполнение оболочки:
kburton@hypothesis:~/projects/elisp$ emacs -batch -l test.el
Loading 00debian-vars...
> (defvar x '(lambda (y) (* y 100)))
=> x
> (funcall x 0.25)
=> 25.0
>
kburton@hypothesis:~/projects/elisp$
Для выполнения всего одного elisp выражения, можно использовать M-: ярлык и вводит выражение в мини-буфер. Для других случаев можно использовать царапина буфер
ESHELL - еще один вариант для интерактивного интерпретатора ELISP.
M-x eshell
Это не только командная оболочка, такая как Bash (или cmd.exe, если в Windows), но вы также можете интерактивно написать и выполнять ELISP код.
~ $ ls
foo.txt
bar.txt
~ $ (+ 1 1)
2