【问题标题】:How to fix both Found 'DD'-anomaly and only one return statement如何修复 Found 'DD'-anomaly 和只有一个 return 语句
【发布时间】:2020-03-23 01:41:42
【问题描述】:

我在修复 PMD 警告时遇到了一些困难,这是我的简化方法:

public String rank(String keyword, int pageSize, int totalPage)
{
    String result = "0"; // A: DataflowAnomalyAnalysis: Found 'DD'-anomaly for variable 'result'
    if (isNotBlank(keyword))
    {
        boolean find = false; // B: DataflowAnomalyAnalysis: Found 'DD'-anomaly for variable 'find'
        for (int page = 1; page < totalPage; page++)
        {
            int rank = getRank(keyword, pageSize, totalPage);
            if (rank != 0)
            {
                find = true; // B(1)
                result = String.valueOf(rank); // A(1)
                break;
            }
        }
        if (!find)
        {
            result = format("{0}+", totalPage * pageSize - 1); // A(2)
        }
    }
    return result;
}

我试过这个并收到“OnlyOneReturn”警告:

public String rank(String keyword, int pageSize, int totalPage)
{
    if (isNotBlank(keyword))
    {
        for (int page = 1; page < totalPage; page++)
        {
            int rank = getRank(keyword, pageSize, totalPage);
            if (rank != 0)
            {
                return String.valueOf(rank); // OnlyOneReturn
            }
        }
        return format("{0}+", totalPage * pageSize - 1); // OnlyOneReturn
    }
    return "0";
}

请问这段代码怎么写?

【问题讨论】:

    标签: pmd


    【解决方案1】:

    “DD”异常和数据流分析告诉您,您多次分配了一个变量,而没有在分配之间使用它。所以除了最后一个任务之外的所有任务都是不必要的。它通常表明您没有正确分离场景。在您的情况下,您有三种情况:

    1. 如果关键字为空,则返回值为“0”。
    2. 否则循环遍历所有页面,如果 getRank() 返回的排名不是零,那么这就是返回值。
    3. 否则返回值为“totalPage * pageSize - 1+”

    如果您逐个实现这些场景,您最终会得到一个没有任何数据流或其他 PMD 问题的方法:

    public String rank(String keyword, int pageSize, int totalPage) {
        String result;
        if (isNotBlank(keyword)) {
            result = "0";
        } else {
            int rank = 0;
            for (int page = 1; page < totalPage && rank == 0; page++) {
                rank = getRank(keyword, pageSize, totalPage);
            }
            if (rank != 0) {
                result = String.valueOf(rank);
            } else {
                result = format("{0}+", totalPage * pageSize - 1);
            }
        }
        return result;
    }
    

    如果您仔细查看 for 循环,您会发现 page 仅用于循环。它不在循环内使用。这表明 for 循环可能不是必需的。 getRank(keyword, pageSize, totalPage) 应该总是返回相同的值,因为它的参数在循环期间永远不会改变。因此,只需调用一次getRank(...) 就足够了。

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2021-02-08
      相关资源
      最近更新 更多