gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:26 26 4
gpt4 key购买 nike

这是我的代码:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com