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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
это возможный сохранить эти регулярные выражения в кэше на диске предварительно скомпилированным способом, чтобы избежать необходимости выполнять regex компиляции на каждом импорте?
Не легко. Необходимо было бы записать пользовательский сериализатор, который сцепляет в реализацию C sre
Python regex механизм. Любые выигрыши в производительности были бы значительно перевешены к этому времени и требуемое усилие.
Первый, Вы на самом деле представили код? Я сомневаюсь, что компиляция regexes является значительной частью времени выполнения приложения. Помните, что они только компилируются в первый раз, когда модуль импортируется в текущем выполнении - после этого, модуль и его атрибуты кэшируются в памяти.
, Если у Вас есть программа, которая в основном мечет икру однажды, компилирует набор regexes и затем выходит, Вы могли попробовать реинжиниринг он для выполнения нескольких тестов в одном вызове. Затем Вы могли снова использовать regexes, как выше.
Наконец, Вы могли скомпилировать regexes в конечные автоматы на базе С и затем связать их в с дополнительным модулем. В то время как это, вероятно, было бы более трудно поддержать, это устранит regex компиляцию полностью из Вашего приложения.
В первую очередь, это - четкое ограничение в модуле ре Python. Это вызывает предел, сколько и как большие регулярные выражения разумны. Предел больше с длительными процессами и меньше с недолгими процессами как приложения командной строки.
Несколько лет назад я действительно смотрел на него, и возможно откопать результат компиляции, засолить его и затем не засолить его и снова использовать его. Проблема состоит в том, что это требует использования sre.py внутренностей и так не будет, вероятно, работать в различных версиях Python.
я хотел бы иметь этот вид функции на моей панели инструментов. Я также хотел бы знать, если существуют какие-либо отдельные модули, которые могли бы использоваться вместо этого.
Обратите внимание, что каждый модуль инициализирует себя только однажды во время жизни приложения, неважно, сколько раз Вы импортируете его. Таким образом, если Вы компилируете свои выражения в глобальной области видимости модуля (т.е. не в функции) необходимо быть в порядке.
Эти откладывают , модуль, кажется, работает просто великолепно:
import re
import shelve
a_pattern = "a.*b"
b_pattern = "c.*d"
a = re.compile(a_pattern)
b = re.compile(b_pattern)
x = shelve.open('re_cache')
x[a_pattern] = a
x[b_pattern] = b
x.close()
# ...
x = shelve.open('re_cache')
a = x[a_pattern]
b = x[b_pattern]
x.close()
можно затем сделать хороший класс обертки, который автоматически обрабатывает кэширование для Вас так, чтобы это стало очевидным для пользователя... осуществление, оставленное читателю.
Откройте/usr/lib/python2.5/re.py и ищите "определение _compile". Вы найдете внутренний механизм кэширования re.py.
Возможно поместить каждый regex (или группа regexs) в отдельный файл и затем динамично импортировать файл, что Вам нужно использование модуля импорта. Я сомневаюсь, что это масштабируется очень хорошо, но это могло быть тем, в чем Вы нуждаетесь.
Гул,
не откладывает рассол использования?
Так или иначе, я соглашаюсь с предыдущим anwsers. Так как модуль обрабатывается только однажды, я сомневаюсь, что компиляция regexps будет Вашим горлышком бутылки приложения. И модуль ре Python является злым быстро, так как он кодируется в C :-)
, Но хорошие новости - то, что Python получил хорошее сообщество, таким образом, я уверен, что можно найти кого-то в настоящее время взламывающего, в чем Вы нуждаетесь.
я погуглил 5 секунд и нашел: http://home.gna.org/oomadness/en/cerealizer/index.html .
не знают, сделает ли это это, но в противном случае удача в Вас исследование :-)