replaceAll, regex и HashMap возвращают мне исключение NullPointerException - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть следующий код:

HashMap<String, String> hm = new HashMap<String, String>();
hm.put("title", "testTitle");
hm.put("year", "testYear");

String s = "<title> - <year>";

String result = s.replaceAll("<([^>]*)>", hm.get("$1"));

Проблема в том, что когда я его выполняю, он возвращает мне это исключение:

Исключение в потоке "main" java.langИсключительная ситуация* Я не понимаю почему, потому что при выполнении в одиночку hm.get ("title") работает, поэтому почему с replaceAll это не так?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 14 декабря 2011

Рассмотрим следующую строку:

String result = s.replaceAll("<([^>]*)>", hm.get("$1"));
  1. Сначала выполняется hm.get("$1") (и возвращается null, поскольку предположительно в hm нет записи с ключом, равным "$1").
  2. Во-вторых, s.replaceAll("<([^>]*)>", null) вызывается и вызывает NPE.

Один из способов сделать то, что вы пытаетесь сделать, - это использовать Matcher и цикл.

1 голос
/ 14 декабря 2011

Следующее может не быть идеальным или оптимальным, и может не работать в некоторых угловых случаях, но оно работает с вашим примером:

HashMap<String, String> hm = new HashMap<String, String>();
hm.put("title", "testTitle");
hm.put("year", "testYear");

String s = "<title> - <year>";

Scanner scan = new Scanner(s);
scan.useDelimiter("<|>");
while (scan.hasNext()) {
    final String token = scan.next();
    final String value = hm.get(token);
    if (value != null) {
        s = s.replace("<" + token + ">", value);
    }
}

System.out.println(s);
1 голос
/ 14 декабря 2011

Перепроверьте свой синтаксис. Читайте "порядок оценки".

hm.get("$1")

будет искать запись в хэш-таблице с ключом точно"$1". Которого не существует, так что вы вернетесь null. Регулярное выражение на данный момент еще не применено, и нет никакого утверждения, которое заменило бы $1 на группу.

Линия

String result = s.replaceAll("<([^>]*)>", hm.get("$1"));

эквивалентно:

String nulLValue = hm.get("$1"); // Note: $1 is not substituted.
String result = s.replaceAll("<([^>]*)>", nullValue);

Посмотрите на различные примеры Java, включающие Pattern и связанные Matcher s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...