使用org.kohsuke GitHub API获取提交作者时遇空指针异常求助
我之前也踩过这个坑,咱们来一步步排查和解决:
问题原因分析
你碰到的NullPointerException本质是ghCommit.getAuthor()返回了null,接着调用getName()触发了空指针。这通常有两种情况:
- GitHub的Commit对象里,提交作者(Author)和提交执行者(Committer)是两个独立角色。像自动化脚本提交、作者没关联GitHub账号、原始提交信息缺失这类场景,Commit的Author字段不会关联到有效的GHUser对象,导致
getAuthor()返回null。 - 少数情况如果你的OAuth Token权限不足,也可能拿不到用户关联信息,但只要token有repo权限,这种情况概率很低。
解决方案
这里给你两个靠谱的解决思路:
思路1:先判空,再降级到Committer
很多时候Committer信息是存在的,可以作为Author的备选选项:
GitHub gitHub = GitHub.connectUsingOAuth(token); GHCommit ghCommit = gitHub.getRepository("select2/select2").getCommit("7303852862575de61a70d3fa71dd3d5b59ea85af"); GHUser author = ghCommit.getAuthor(); String displayName; if (author != null) { displayName = author.getName(); } else { // 降级使用Committer信息 GHUser committer = ghCommit.getCommitter(); displayName = committer != null ? committer.getName() : "Unknown Contributor"; } System.out.print(displayName);
思路2:直接读取Commit元数据中的作者信息
GitHub的Commit元数据里必然包含作者名字(哪怕没关联GitHub账号),你可以通过getCommitShortInfo()获取这部分信息,它返回的CommitUser不会是null:
GitHub gitHub = GitHub.connectUsingOAuth(token); GHCommit ghCommit = gitHub.getRepository("select2/select2").getCommit("7303852862575de61a70d3fa71dd3d5b59ea85af"); // 获取Commit的基础元数据,里面的Author是CommitUser类型,包含名字、邮箱等信息 GHCommit.CommitShortInfo commitMeta = ghCommit.getCommitShortInfo(); System.out.print(commitMeta.getAuthor().getName());
补充说明
两种Author获取方式的区别:
ghCommit.getAuthor():返回关联GitHub账号的GHUser对象,可能为null,但能拿到用户头像、主页等完整账号信息。commitMeta.getAuthor():返回Commit元数据里的CommitUser对象,永远不会为null,包含提交时填写的名字和邮箱,但没有账号相关的额外信息。
你可以根据需求选合适的方式,一般场景下思路2更稳妥,能直接避免空指针问题。
内容的提问来源于stack exchange,提问作者ChrisX
相关产品推荐
相关产品推荐

