如何修复AEM6.5中SonarQube提示的「不应捕获NullPointerException」错误
修复SonarQube的「NullPointerException should not be caught」错误
SonarQube提示这个错误的核心原因是:NullPointerException属于可以提前通过代码避免的编程错误,而非需要捕获处理的异常。你的修改没解决问题,是因为还有多个潜在的NPE风险点没覆盖,且用了生产环境不生效的assert。
你的代码存在的问题
assert pageManager != null:assert在生产环境默认是禁用的,不会执行,等于没做校验requestedPage = pageManager.getPage(rootvalue):getPage()方法找不到对应页面时会返回null,直接调用listChildren()会触发NPEsiblingPage.getProperties():部分场景下getProperties()可能返回null,后续调用get("hideInNav")会触发NPE
修复后的代码
@PostConstruct protected void init() { if (resourceResolver == null) { log.error("resourceResolver is null in SideNavigation"); return; } pageManager = resourceResolver.adaptTo(PageManager.class); if (pageManager == null) { log.error("Failed to adapt resourceResolver to PageManager in SideNavigation"); return; } requestedPage = pageManager.getPage(rootvalue); if (requestedPage == null) { log.error("Requested page not found for root value: {}", rootvalue); return; } Iterator<Page> siblingPages = requestedPage.listChildren(); if (siblingPages == null) { log.debug("No sibling pages found for requested page: {}", requestedPage.getPath()); return; } while (siblingPages.hasNext()) { Page siblingPage = siblingPages.next(); if (siblingPage == null) { continue; } ValueMap properties = siblingPage.getProperties(); if (properties == null) { continue; } if (properties.get("hideInNav") == null) { siblingItems.add(siblingPage); } } }
修复说明
- 对每个可能返回null的对象(resourceResolver、pageManager、requestedPage、siblingPages、siblingPage、properties)都做了非空校验
- 每个校验分支都添加了针对性的日志,便于排查问题
- 移除了
assert和NPE捕获逻辑,完全通过前置校验避免NPE - 循环中遇到null的siblingPage直接跳过,不影响后续处理
内容的提问来源于stack exchange,提问作者Naveen Rapelly
相关产品推荐
相关产品推荐

