如何针对特定函数抑制Java编译器警告

28

我们通常在 switch 语句中使用 break 来避免出现 fall-through。

Java 编译器会发出警告,以帮助我们避免犯下微不足道但却严重的错误。

然而,我曾经将 case 的 fall-through 当作一种特性来使用(我们不必在这里讨论,但它提供了一种非常优雅的解决方案)。

然而,编译器会输出大量警告信息,可能会掩盖我需要知道的警告信息。我知道如何更改编译器以忽略所有 fall-through 警告,但我想在每个方法上实现此功能,以避免错过我不打算出现 fall-through 的地方。

有什么建议吗?


你所说的“fall through”,是指在switch语句中的“穿透”吗? - Elijah
正如Ron所说的,当谈到case语句中的break时,是的。 - Nicolas
是的,抱歉,我想“switch语句”比“case”更准确(已在上面进行了编辑)。 - Ron Tuffin
5个回答

43
如果你确实非常需要这样做,并且确定自己不会犯错,可以查看@SuppressWarnings注释。我想在你的情况下,你需要。
@SuppressWarnings("fallthrough")

2
如果您正在寻找有效的SuppressWarnings列表,请尝试访问以下链接:https://dev59.com/NnM_5IYBdhLWcg3w1G-N - Nick
@Nick,那个问题只列出了IDE的抑制警告标识符。在哪里可以找到javac的列表?@starblue,你在哪里找到@SuppressWarnings("fallthrough")?从OpenJDK 17开始,它似乎确实适用于javac! - Garret Wilson
哦,我猜它们是来自于例如Java 17的javac文档中的相同-Xlint代码。 - Garret Wilson

4

您是否需要使用注解@SuppressWarnings (javadoc)?

例如:

@SuppressWarnings("unchecked")
public void someMethod(...) {
    ...
}

3
我认为应该使用@SuppressWarnings("fallthrough")而不是"unchecked" (http://www.java-tips.org/java-se-tips/java.lang/introducing-annotations.html)。 - Tobias Schulte
2
Eclipse编译器还提供了//$FALL-THROUGH$标记。不幸的是,它与方法注释的协作不是很好(最好允许注释和标记,并在存在注释时警告所有非标记的fall throughs)。 - eckes

4

关于SuppressWarnings的其他答案已经完成:

@SuppressWarnings("fallthrough")

尝试在编译器级别抑制所有的“穿透警告”是不好的做法:正如您所解释的那样,需要通过警告的情况是明确确定的。因此,应该在代码中明确写入(欢迎使用@SuppressWarnings("fallthrough")注释和可选注释)。这样做,如果您真的忘记了在某个其他地方使用break,仍然会有“穿透警告”。

1
你可以使用一系列的'if'语句来替代switch。可能没有那么直观,但也不像警告抑制一样让人不舒服。

2
此外,一个 if 级联可能比一个 switch 更不高效。 - Paŭlo Ebermann

0
@SuppressWarnings("fallthrough")

Java一直遵循C风格的switch语句,其中你需要显式地跳出一个switch,除非你希望简单地顺序执行下面case中的代码。当然,这可能很危险,这种类型的错误可能非常难以跟踪。在下面的示例中,case 1缺少了一个break:

@SuppressWarnings("fallthrough")
public void fallthroughTest(int i)
{
    switch (i)
    {
        case 1:
            // Execute both 1 and 2
        case 2:
            // Execute only 1
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接