java - IntelliJ 提示 "for statement does not loop"?

标签 java for-loop intellij-idea

这是我的代码:

public enum Modification {
    NONE, SET, REMOVE;
}

boolean foo(){
    for (S s : sList) {
        final Modification modification = s.getModification();
        switch (modification) {
            case SET:
            case REMOVE:
                return true;
            /*
            case NONE:
                break;
            */
        }
    }
    return false;
}

当代码如上所示时,IntelliJ 会说:

'for' statement does not loop less... () Reports any instance of for, while and do statements whose bodies are guaranteed to execute at most once. Normally, this is an indication of a bug.

只有我进行以下更改,IntelliJ 才会高兴:

for (S s : sList) {
    final Modification modification = s.getModification();
    switch (modification) {
        case SET:
        case REMOVE:
            return true;
        case NONE:
            break;
    }
}

如果 case NONE: 不包含在 switch 语句中,为什么我的 for 循环不循环?

最佳答案

我刚刚在 eclipse 中试过这个,你最终在 switch 语句上收到编译器警告。

The enum constant NONE needs a corresponding case label in this enum switch on Modification

要解决警告,我有以下选项。

  • 添加默认情况
  • 添加缺失的案例陈述
  • 将@SuppressWarnings 'incomplete-switch' 添加到 foo()

如果我添加缺失的 case 语句,则不再出现警告。与添加丢失的大小写相同会使您的 error 警告从 intellij 中消失。

如果没有 case NONE 语句,您只能看到两种情况,这两种情况都返回 true。在不知道 Modification 的结构和 NONE 的额外值的情况下,看起来这个循环只会在循环的第一次迭代中返回 true。

当然,编译器实际上应该知道 Modification 的值比 SET 和 REMOVE 的值多,所以警告只是为了好的风格。基本上您的代码可以工作,但这里是改进它的方法。

我会选择添加默认语句而不是缺失的大小写。如果以后将更多值添加到枚举中,这将更有前途。例如

switch (modification) 
{
  case SET:
  case REMOVE:
    return true;
  default:
    break;
}

就我个人而言,我不喜欢使用 fall through on switch 语句。恕我直言,您在使代码简洁方面获得的 yield 在易读性方面有所损失。如果稍后有人来并在 SET 和 REMOVE 之间添加一个 case,它可能会引入一个错误。此外,在方法中途使用 return 语句也会导致问题。如果有人想在返回之前添加一些代码,他们可能会错过所有地方。如果该方法非常简单,那么多次返回就可以了,但您已经声明这是一个简化的示例,因此如果这段代码很复杂,我会避免使用它。

如果您能够使用 Java 8,那么这看起来是新流 API 的完美用例。像下面这样的东西应该可以工作。

return sList.stream().anyMatch(
  modification -> (modification==Modification.SET || modification==Modification.REMOVE)
);

关于java - IntelliJ 提示 "for statement does not loop"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36304002/

相关文章:

java - 如何使用 IntelliJ IDEA 导出 JAR(JavaFX 和 Maven)

java - Liquibase 错误 [Postgresql] : unterminated dollar-quoted string at or near "$BODY$

java - Java 方法调用时自动向下转型

java - Spring @Async 被忽略

java - 捕获 JSONException

java - 如何将嵌套对象列表缩减为 Map

java - 数组倒计时的反向循环

javascript - for循环中变量名可以由数组值决定吗?

java - IntelliJ IDEA 生成 serialVersionUID

java - Intellij Idea lib文件夹导出