首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java流同时循环来自PMD的异常警告

Java流同时循环来自PMD的异常警告
EN

Stack Overflow用户
提问于 2020-06-18 08:22:33
回答 1查看 395关注 0票数 0

在下面的代码中,我创建了一个新的ID,检查它是否存在,并返回它是否唯一:

代码语言:javascript
运行
复制
private String generateNewId(List<Item> items) {
    do {
        String newId = ... // generateNewId from another method
        if (items.stream.noneMatch(i -> i.getId().equals(newId))) {
            return newId;
        }
    } while(true);
}

然而,我得到了PMD异常:

  • 发现了‘DD’-变量‘newId’
  • 发现了‘DU’-变量'newId'

的异常

来自PMD文件:

  1. DU -异常:最近定义的变量未定义.这些异常可能出现在正常的源文本中。
  2. DD -异常:最近定义的变量被重新定义。这是个不祥的预兆,但不一定非得是个bug。--

我尝试将newId变量移出循环,但随后得到了错误: lambda中使用的变量应该是最终变量,或者实际上是最终变量。

我如何重构我的代码以消除这些异常?还是我应该把这些警告压制为假阳性呢?

EN

Stack Overflow用户

回答已采纳

发布于 2020-06-20 10:15:02

您正在看到DD异常,因为当if条件计算为false时,变量newIddo { } while(true)循环中被重新定义。

不过,我认为DU异常是假阳性。在这种情况下,newId总是至少使用一次:

如果项目列表为空,则如果项目列表不是空的,则返回nonMatch,则在nonMatch的闭包中使用newId

但是,这是PMD无法解决的问题,因为它不知道noneMatch的语义。如果您将noneMatch替换为anyMatch,那么这将是一个真正的DU异常。

DD和DU异常通常很难修复,因为它们指出了更高层次上的设计问题。在这种情况下,问题不是变量newId本身,而是do { } while(true)的使用,这可能导致无限循环,因为您忽略了不能生成新的唯一id的情况。

解决这个问题的一种方法是解决这个问题:

代码语言:javascript
运行
复制
    private String generateNewId(List<Item> items) {
        return Stream.generate(this::getRandomId)
                     .limit(100)
                     .filter(id -> isNew(id, items))
                     .findAny()
                     .orElseThrow(() -> new NoSuchElementException("Failed to generate unique id."));
    }

    private String getRandomId() {
        return "4";  // chosen by fair dice roll.
                     // guaranteed to be random.
    }

    private boolean isNew(String id, List<Item> items) {
        return items.stream().noneMatch(item -> id.equals(item.getId()));
    }

此解决方案通过尝试生成一个新id最多100次来解决无限循环问题,并在失败时抛出异常。根据您的情况,您可以选择不同的限制。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62445530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档