【问题标题】:Java Regex NPE On Matcher.Find() [closed]Matcher.Find() 上的 Java Regex NPE [关闭]
【发布时间】:2020-01-29 14:42:29
【问题描述】:

我要疯了,想弄清楚为什么这不起作用。

我有一个变更日志文件,我想在其中使用内容并解析出版本号。我有一个现有的正则表达式,我已将它用作新正则表达式的基线,以仅去除版本号并可以看到它有效。但是,当我尝试使用 .find() 方法迭代新的 Matcher 结果以获取版本号时,我得到了一个空指针异常并且没有找到任何结果。

正则表达式、编译方式或其他问题是否存在问题?

FWIW,当我在一些在线正则表达式编辑器(基于 Java)上尝试时,正则表达式模式完全符合我的要求。

这就是我正在运行的内容。

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloWorld{

    public static final String changelog="## Current Version"+
            "\n\n"+
            "- None"+
            "\n\n"+
            "## 5.18.72 (2020-01-17)"+
            "\n\n"+
            "- #### [US12345]"+
            "\n\n"+
            "## 5.18.71 (2020-01-15)"+
            "\n\n"+
            "- #### [US123456]"+
            "\n\n"+
            "## 5.18.70 (2020-01-09)";

    private static final String RAW_CHANGELOG_PATTERN = "(?ms)(##[\\w\\s\\-]*.%s.*\n\n.*)(\n\n##[\\w\\s\\-]*.%s)";
    private static final String RAW_CHANGELOG_VERSION_PATTERN="(?ms)(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})";

     public static void main(String []args){


        System.out.println(extractKnownVersions(changelog));

        System.out.println("Next\n");

        System.out.println(extractVersions(changelog.toString()));
     }

    private static String extractKnownVersions(String changelog){
        String patternString = String.format(RAW_CHANGELOG_PATTERN,"5.18.72","5.18.70");
        Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(changelog);
        String result = null;
        if (matcher.find()) {
            result = matcher.group();
        } else {
            System.out.println("No diff found between versions 5.18.72 and 5.18.70 Check that both versions exist in Changelog.");
        }
        return result;
    }

    private static List<String> extractVersions(String changelog) {
        // TODO: Fix the regex so that it actually grabs what we want
        String patternString = RAW_CHANGELOG_VERSION_PATTERN;
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(changelog);

        List<String> result = null;
        int count = 0;

        try {
            while (matcher.find()) {
                result.add(matcher.group());
                System.out.println("result: " + result.get(count));
                count++;
            }
        } catch (NullPointerException npe) {
            System.out.println("NPE: Could not extract versions from Changelog");
        } catch (Exception e) {
            System.out.println("Exception extracting versions from Changelog");
        }

        System.out.println("match count:" + count);
        return result;
    }
}

这是 SOP 上的输出——注意原始正则表达式 RAW_CHANGELOG_PATTERN 工作并产生我期望的输出(两个版本号之间的所有内容),但第二种方法 extractVersions 使用新的正则表达式 @987654324 @ 正在抛出 NPE。

## 5.18.72 (2020-01-17)

- #### [US12345]

## 5.18.71 (2020-01-15)

- #### [US123456]

## 5.18.70
Next

NPE: Could not extract versions from Changelog
match count:0
null

我希望这是我缺少的一些愚蠢的语法吗?

【问题讨论】:

  • 如果你没有吞下你的堆栈跟踪,调试它会更容易,而是将它们打印出来,这样你就可以看到发生了什么。

标签: java regex nullpointerexception matcher


【解决方案1】:

您的 NPE 来自未初始化列表:

List<String> result = null;

改为

List<String> result = new ArrayList<>();

result: 5.18.72
result: 5.18.71
result: 5.18.70
match count:3
[5.18.72, 5.18.71, 5.18.70]

【讨论】:

  • 搞定 - 非常感谢您的快速回复!
猜你喜欢
  • 2017-10-02
  • 2018-04-23
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2013-07-20
  • 2020-11-25
  • 1970-01-01
相关资源
最近更新 更多