OnlyOneReturn 无DD异常

OnlyOneReturn without DD anomaly

@RequestMapping(value = "/product/baselist", method = RequestMethod.POST)
public ResponseEntity<Object> baseListProductFilters(@RequestBody final ObjectNode json) {
    LOGGER.debug("Gettig all product filters");
    try {
        final int offset = json.get("offset") == null ? OFFSET_AUTOCOMPL
                : json.get("offset").asInt(OFFSET_AUTOCOMPL);
        final int limit = json.get("limit") == null ? LIMIT_AUTOCOMPL : json.get("limit").asInt(LIMIT_AUTOCOMPL);

        return ResponseEntity.status(HttpStatus.OK)
                .body(filterService.getList(getUsername(), ResourceType.PRODUCT, offset, limit));
    } catch (Exception e) {
        LOGGER.error("Error getting product filter list: ", e);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e);
    }
}

这是我的代码。我安装了 PMD 代码分析器。它建议我应该只有一个 RETURN。所以我这样做了:

@RequestMapping(value = "/product/baselist", method = RequestMethod.POST)
public ResponseEntity<Object> baseListProductFilters(@RequestBody final ObjectNode json) {
    LOGGER.debug("Gettig all product filters");
    ResponseEntity<Object> toReturn;
    try {
        final int offset = json.get("offset") == null ? OFFSET_AUTOCOMPL
                : json.get("offset").asInt(OFFSET_AUTOCOMPL);
        final int limit = json.get("limit") == null ? LIMIT_AUTOCOMPL : json.get("limit").asInt(LIMIT_AUTOCOMPL);

        toReturn = ResponseEntity.status(HttpStatus.OK)
                .body(filterService.getList(getUsername(), ResourceType.PRODUCT, offset, limit));
    } catch (Exception e) {
        LOGGER.error("Error getting product filter list: ", e);
        toReturn = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e);
    }
    return toReturn;
}

不再有 OnlyOneReturn 违规,但出现 'DD'-异常。我的客户要求 OnlyOneReturn 不能被忽略。我有什么想法可以解决这个问题吗?

我建议使用 ExceptionHandler 来处理控制器中的错误情况。这样 DD 异常就会消失。

答案是:issue/who在乎什么?

我认为关于 规则的代码很少,这就是为什么两者("OnlyOneReturn" 作为 "DataflowAnomalyAnalysis")都是 Controversial Ruleset ..说明:

The Controversial Ruleset contains rules that, for whatever reason, are considered controversial. They are separated out here to allow people to include as they see fit via custom rulesets. This ruleset was initially created in response to discussions over UnnecessaryConstructorRule which Tom likes but most people really dislike :-)

因此,在这种情况下,您必须决定您更多地考虑哪条规则 important/applicable。 (我一般坚持"OnlyOneReturn";)

我作为 PMD 维护者的两分钱。

应谨慎对待有争议的规则集中的规则。确保添加每一个确实有意义。仅仅因为它是 PMD 的一部分就包括整个规则集通常不是一个好主意。我们正在努力建立更好的默认值/有更好的规则,但与此同时要小心。

DataflowAnomalyAnalysis 目前的规则很糟糕。

  • 并非所有异常都意味着存在问题/有意义。 UR 异常意味着代码甚至无法编译。 DU异常在代码中其实很常见。 DD 异常最多可能指向虚假分配,但并不一定意味着存在错误。
  • 该规则没有正确处理所有 Java 结构。 assert没处理好,for-each没处理好,try-with-resources没处理好……还有很多open issues on GitHub for this

我们确实计划最终对其进行改造(但目前不是最优先考虑的事情,因为我们正在研究其他一些我们认为对日常开发人员工作有更大影响的核心功能)。

同时,您可能应该禁用该规则,或者根据需要add suppressions

如果您发现更多失败场景,请提交问题。