Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Наиболее очевидной проблемой является $1
. В регулярном выражении вы можете ссылаться на группу # 1, используя \1
, а не $1
. (,$1)*
в вашем регулярном выражении никогда не будет соответствовать чему-либо. Но ссылка на группу ничего не собирается делать.
Когда вы используете ссылку на группу в регулярном выражении, вы снова не применяете эту часть регулярного выражения, вы просто соответствуете тому же вещь, с которой она соответствовала в первый раз. То есть, (ACA[A-Z])(,\1)*
будет соответствовать ACAA,ACAA
, но не ACAA,ACAB
или ACAA,ACAC
. Если вы хотите это сделать, вам нужно повторить текущее регулярное выражение: (ACA[A-Z])(,ACA[A-Z])*
. Поскольку вы генерируете регулярное выражение динамически, это не должно быть проблемой.
Обратите внимание, что это все регулярное выражение: ACA[A-Z](,ACA[A-Z])*
. Нет необходимости сопоставлять материал, предшествующий или следующий за интересующей вас частью; это просто усложняет работу (и результаты более запутывают). Вы можете получить доступ к результату соответствия напрямую, вместо использования этого трюка «replace»:
var match = mRegex.exec(generation);
if (match != null) {
mSiblings = match[0];
}