Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Поскольку ваш класс символов [A-z]
соответствует этому символу.
[A-z]
соответствует [
, \
, ]
, ^
, _
, `
и английские буквы.
На самом деле это распространенная ошибка. Вы должны использовать [a-zA-Z]
вместо того, чтобы разрешать только английские буквы.
Вот визуализация из Expresso, показывающая, что на самом деле охватывает диапазон [A-z]
:
[/g1]
Итак, это регулярное выражение (с опцией i
) не будет записывать вашу строку.
^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$
На мой взгляд, это всегда безопаснее использовать опцию Ignorecase
, чтобы избежать такой проблемы и сократить регулярное выражение.
Вы разрешаете A-z (капитал «A» через нижний «z»). Вы не говорите, какой пакет регулярных выражений вы используете, но не обязательно ясно, что A-Z и a-z смежны; между ними могут быть другие символы. Попробуйте это вместо:
^(?=.*[0-9])(?=.*[A-Za-z])[0-9A-Za-z-]{17}$
Кажется, что я отвечаю вашим критериям для меня в regexpal.
regex использует ASCII печатные символы из пробела в диапазон тильдов.
blockquote>Всякий раз, когда мы используем маркер
[A-z]
, он соответствует следующей таблице выделенных символов. Если мы используем маркер[ -~]
, он соответствует начиная сSPACE
до тильды.