如何修复发现的“ DD”异常和仅一个返回语句

问题描述 投票:1回答:1

修复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个回答
0
投票

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(...)就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.