System.out.print удаляет исключение класса Matcher - PullRequest
0 голосов
/ 03 декабря 2018

Итак, я использовал Jsoup для сканирования некоторых веб-страниц, и эта проблема с проводной связью возникает.

С выражением регулярного выражения

// Sets the prefix for all pages to prevent navigate to unwanted pages.
String prefix = "https://handbook.unimelb.edu.au/%d/subjects";
// Postfix for search page
String searchPostfix = "(\\?page=\\d+)?$";
// Postfix for subject page
String subjectPostfix = "\\/(\\w+)(\\/.+)?$";

String root = String.format(prefix, "2019");
String pattern = root.replace("/", "\\/").replace(".", "\\.");
Pattern reg1 = Pattern.compile("^" + pattern + searchPostfix);
Pattern reg2 = Pattern.compile("^" + pattern + subjectPostfix);

С этими шаблонами регулярных выражений.Я запустил его со строкой

String s1 = "https://handbook.unimelb.edu.au/2019/subjects/undergraduate";

И с методом:

private String getSubjectCode(String link) {
    System.out.println(link);
    if (isSubjectPage(link)) {
        Matcher subjectMatcher = subjectPattern.matcher(link);
        System.out.println(link);
        // System.out.println(subjectMatcher.matches());   ## Exception if commented
        System.out.println(subjectMatcher.group(0));
        System.out.println(subjectMatcher.group(1));


        return subjectMatcher.group(1);
    }
    return null;
}

Что произойдет, если я оставлю эту закомментированную строку без комментария, программа будет работать хорошо.

Однако, если я прокомментирую эту строку

Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.base/java.util.regex.Matcher.group(Matcher.java:645)
    at Page.Pages.getSubjectCode(Pages.java:54)
    at Page.Pages.enqueue(Pages.java:85)
    at Crawler.Crawler.parsePage(Crawler.java:41)
    at Crawler.Crawler.crawl(Crawler.java:51)
    at Main.main(Main.java:9)

Выше приведенное исключение, почему строка печати влияет на работу программы?

Кроме того, без комментариев

System.out.println(subjectMatcher.matches());   // Exception if commented
// out -> true

1 Ответ

0 голосов
/ 03 декабря 2018

Разница не в System.out.println, а в побочном эффекте вызова метода matches().

Это объясняется в JavaDocs Matcher

Сопоставление создается из шаблона путем вызова метода сопоставления шаблона.После создания средство сопоставления можно использовать для выполнения трех различных типов операций сопоставления:

  • Метод matches пытается сопоставить всю входную последовательность с шаблоном.
  • The *Метод 1016 * пытается сопоставить входную последовательность, начиная с начала, с шаблоном.
  • Метод find сканирует входную последовательность в поисках следующей подпоследовательности, которая соответствует шаблону.

И

Явное состояние сопоставителя изначально не определено;попытка запросить любую его часть до успешного совпадения вызовет выброс IllegalStateException.Явное состояние сопоставления пересчитывается каждой операцией сопоставления.

Вам нужно позвонить либо matches, lookingAt или find, прежде чем вы сможете выполнять дополнительные запросы, такие как group(0).

...