Java 中有效的@SuppressWarnings警告名称列表是什么?

What is the list of valid @SuppressWarnings warning names in Java?

提问人:Ron Tuffin 提问时间:7/30/2009 最后编辑:DimitarRon Tuffin 更新时间:10/20/2023 访问量:196291

问:

Java 中的有效警告名称列表是什么?@SuppressWarnings

介于 in 之间的位。("")@SuppressWarnings("")

Java Eclipse 编译器警告 抑制警告

评论

6赞 Snicolas 9/21/2016
这个问题真的很好,答案很有用。如果 JCP 的某个人查看了它,您应该意识到添加禁止警告是多么混乱。没有关于大小写、连字符、骆驼大小写的约定,只是一团糟,标准化会很可爱。
0赞 kevinarpe 4/20/2017
我在Eclipse Collections Framework()中看到,下面没有列出。"ProhibitedExceptionDeclared"org.eclipse.collections.impl.block.function.checked.ThrowingFunction

答:

293赞 cletus 7/30/2009 #1

这取决于您的 IDE 或编译器。

以下是 Eclipse Galileo 的列表

  • all 禁止显示所有警告
  • 装箱以禁止显示与装箱/取消箱操作相关的警告
  • CAST 用于禁止显示与强制转换操作相关的警告
  • dep-ann 禁止显示与已弃用注释相关的警告
  • 弃用以禁止显示与弃用相关的警告
  • 回退以禁止显示与交换机中缺少中断相关的警告 语句
  • finally 禁止显示相对于 finally 阻止的警告 返回
  • 隐藏以禁止显示与隐藏变量的局部变量相关的警告
  • incomplete-switch 用于禁止显示与缺少条目相关的警告 在 switch 语句中(枚举大小写)
  • NLS 禁止显示相对于非 NLS 字符串文本的警告
  • null 禁止显示与 null 分析相关的警告
  • 限制禁止使用与使用“不鼓励”或“不鼓励”相关的警告 禁止引用
  • serial 禁止显示与缺少的 serialVersionUID 相关的警告 可序列化类的字段
  • static-access 用于抑制与不正确的 static 相关的警告 访问
  • 合成访问,用于抑制与未优化相关的警告 从内部类访问
  • “未选中”以禁止显示与未选中操作相关的警告
  • unqualified-field-access,用于禁止显示与字段相关的警告 访问不合格
  • unused 用于禁止显示与未使用代码相关的警告

Indigo 的列表添加:

  • javadoc 禁止显示与 javadoc 警告相关的警告
  • rawtypes,用于禁止显示与原始类型使用相关的警告
  • static-method 来禁止与可能声明为 static 的方法相关的警告
  • super,禁止显示与在没有 super 调用的情况下重写方法相关的警告

Juno的名单补充道:

  • 资源,以禁止显示与 Closeable 类型的资源的使用相关的警告
  • sync-override 用于在重写同步方法时禁止显示由于缺少 synchronize 而发出的警告

Kepler 和 Luna 使用与 Juno 相同的令牌列表(列表)。

其他的将相似但有所不同。

评论

0赞 Jesse Jashinsky 11/30/2012
在什么情况下,禁止显示 null 警告有用?
0赞 par 3/13/2013
@Jesse:当编译器出错时(即“'愚蠢的法兰德斯'警告”)。尝试编译:.某些环境(例如,NetBeans 7.3 w/ Java 6 JDK [1.6.0_41])将在调用时生成,即使此时不能为 null。void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }"o possibly null"o.toString()o
2赞 K.C. 8/9/2013
@cletus : 是否可以在 eclipse 中添加警告类型?问题在于,我们的一个团队成员使用了 IntelliJ,而 IDE 还有其他抑制警告类型,可以在 Eclipse :)中发出警告在 Eclipse Indigo 中,您可以在首选项中设置:忽略未使用的 SuppressWarnings 令牌,但这似乎不起作用......
0赞 Kissaki 9/11/2014
semicolon在 Luna 中似乎不起作用?:(有人可以验证是否确实有效吗?semicolon
2赞 ihebiheb 2/24/2020
链接已损坏
52赞 Martin McNulty 7/30/2009 #2

允许所有值(忽略无法识别的值)。已识别的列表是特定于编译器的。

在 Java 教程中,它们被列为 Java 语言规范所需的两个警告,因此,它们应该对所有编译器都有效:uncheckeddeprecation

每个编译器警告都属于一个类别。Java 语言规范列出了两个类别:弃用和未选中。

Java 语言规范中定义它们的特定部分在各个版本之间并不一致。在 Java SE 8 规范中,分别在第 9.6.4.5 节中列为编译器警告。 @SuppressWarnings 和 9.6.4.6 @Deprecateduncheckeddeprecation

对于 Sun 的编译器,运行会给出该版本识别的所有值的列表。对于 1.5.0_17,列表显示为:javac -X

  • 折旧
  • 猖獗
  • 跌落
  • 路径
  • 串行
  • 最后

评论

0赞 kol 9/1/2023
javac -X更笼统,但给出了一个不错的警告名称列表。javac --help-lint
1赞 TWiStErRob 10/20/2023
@kol那是因为时间旅行......这个答案可以追溯到:)Java 5-16 和 Java 17-21 用于列出实际选项。javac -help -Xjavac --help-lint-Xlint
49赞 D. Wroblewski 7/30/2009 #3

该列表是特定于编译器的。但以下是 Eclipse 中支持的值:

  • all弃用 弃用,甚至在已弃用的代码中
  • allJavadoc 无效或缺少 javadoc
  • assertIdentifier 用作标识符的断言的出现
  • 拳击自动拳击转换
  • charConcat,当 char 数组在字符串连接中使用而不显式转换为字符串时
  • condition分配可能的意外布尔赋值
  • constructorName 方法替换为 构造函数名称
  • dep-ann 缺少@Deprecated 注解
  • 弃用弃用的类型或已弃用代码之外的成员
  • 不鼓励使用与不鼓励的访问规则匹配的类型
  • emptyBlock 未记录的空块
  • enumSwitch, 不完整开关 不完整枚举开关
  • 穿可能的跌穿情况
  • field隐藏隐藏另一个变量的字段
  • 具有最终边界的 finalBound 类型参数
  • 最后 终于 块 无法正常完成
  • 禁止使用与禁止的访问规则匹配的类型
  • 隐藏 fieldHiding、localHiding、typeHiding 和 maskedCatchBlock 的宏
  • indirect静态对静态成员的间接引用
  • intfAnnotation 用作超级接口的注解类型
  • intfNonInherited 接口非继承方法兼容性
  • javadoc 无效的 javadoc
  • local隐藏局部变量隐藏另一个变量
  • maskedCatchBlocks 隐藏的 catch 块
  • nls 非 nls 字符串文字(缺少标签 //$NON-NLS-)
  • noEffect分配无效的赋值
  • null 可能缺失或冗余 null 检查
  • nullDereference 缺少 null 检查
  • Over-ann 缺少@Override注释
  • param为参数分配赋值
  • pkgDefaultMethod 尝试覆盖 package-default 方法
  • 原始类型的原始用法 A(而不是参数化类型)
  • 分号、不必要的分号或空语句
  • serial 缺少 serialVersionUID
  • specialParamHiding 构造函数或 setter 参数隐藏另一个字段
  • indirectStatic 和 staticReceiver 的静态访问
  • staticReceiver(如果使用非静态接收器获取静态字段或调用静态方法)
  • 在不进行超级调用的情况下超级重写方法
  • 抑制使能@SuppressWarnings
  • syntheticAccess,对内部类执行合成访问时的合成访问
  • 任务:启用对源代码中任务标记的支持
  • type隐藏类型参数隐藏另一种类型
  • 未选中未选中的类型操作
  • unnecessaryElse 不必要的 else 子句
  • unqualified-field-access, unqualifiedField unqualified 对字段的引用
  • unusedArgument、unusedImport、unusedLabel、unusedLocal、unusedPrivate 和 unusedThrown 的未使用
  • unusedArgument 未使用的方法参数
  • unused导入未使用的导入引用
  • unusedLabel 未使用的标签
  • unusedLocal 未使用的局部变量
  • unusedPrivate 未使用的私有成员声明
  • unusedThrown 未使用声明的抛出异常
  • uselessTypeCheck 不必要的 cast/instanceof 操作
  • varargsCast varargs 参数需要显式强制转换
  • warningToken 未处理的警告令牌在@SuppressWarnings

Sun JDK (1.6) 有一个较短的受支持警告列表

  • 折旧检查折旧物品的使用情况。
  • 猖獗提供有关 Java 语言规范规定的未经检查的转换警告的更多详细信息。
  • 串行警告可序列化类上缺少 serialVersionUID 定义。
  • 最后警告无法正常完成的 finally 子句。
  • 跌落检查开关块是否存在掉落情况,并为发现的任何情况提供警告消息。
  • 路径检查环境路径中不存在的路径(例如类路径)。

适用于 mac 的最新可用 javac (1.6.0_13) 具有以下受支持的警告

  • 折旧
  • 迪夫泽罗
  • 猖獗
  • 跌落
  • 路径
  • 串行
  • 最后
  • 重写

评论

0赞 Ron Tuffin 8/7/2009
这里的 Eclipse 列表查看编译器标志,而不是 SuppressWarning 注解(检查您链接的文档的最后一部分)。
4赞 D. Wroblewski 8/7/2009
他们都是。通过设置编译器标志,您可以告诉编译器您想要什么样的警告。使用批注,可以在代码中的特定位置禁止显示这些警告。
0赞 Peter Štibraný 9/8/2009
我认为 Eclipse 的列表更短。请参阅最新的 galileo 文档,SupressWarnings 的可用令牌列表在那里是明确的:help.eclipse.org/galileo/index.jsp?topic=/...
2赞 Jesper 12/10/2009
我在 Eclipse 3.5 中尝试了 @SuppressWarnings(“raw”),但它不起作用 - 我收到一个警告,说它“raw”不是此注释的有效值。
0赞 stu 12/30/2009
我也是。不幸的是,jsp 支持并不像 java 支持那样被淘汰。
2赞 matteo 10/12/2014 #4

这似乎是一个更完整的列表,我在其中发现了一些我在其他地方找不到的特定于 Android Studio 的警告(例如):SynchronizeOnNonFinalField

https://jazzy.id.au/2008/10/30/list_of_suppresswarnings_arguments.html

哦,现在 SO 的指导方针与 SO 的限制相矛盾。 一方面,我应该复制列表,而不是只提供链接。 但另一方面,这将超过允许的最大字符数。因此,让我们只希望链接不会中断。

1赞 Ciro Santilli OurBigBook.com 3/26/2015 #5

JSL 1.7 版本

Oracle 文档提到:

  • unchecked:未选中的警告由字符串“unchecked”标识。
  • deprecation:当使用类型、方法、字段或构造函数时,Java 编译器必须生成弃用警告,其声明带有注释@Deprecated进行注释(即覆盖、调用或按名称引用),除非:[...]使用是在被注释的实体内,以使用注释 @SuppressWarnings(“弃用”)禁止显示警告;或

然后,它解释了实现可以添加和记录自己的实现:

编译器供应商应记录他们支持的警告名称以及此注释类型。鼓励供应商合作,以确保相同的名称在多个编译器中工作。

评论

1赞 kbolino 10/16/2016
这是不正确的,这是标准认可的唯一一个;您引用的下一节说,当“使用是在带有注释的实体内以禁止使用注释的警告时,不应生成弃用警告unchecked@SuppressWarnings("deprecation")"
3赞 Matt Campbell 12/21/2017 #6

我只想补充一点,在以下位置有一个 IntelliJ 抑制参数的主列表:https://gist.github.com/vegaasen/157fbc6dce8545b7f12c

它看起来相当全面。部分:

Warning Description - Warning Name

"Magic character" MagicCharacter 
"Magic number" MagicNumber 
'Comparator.compare()' method does not use parameter ComparatorMethodParameterNotUsed 
'Connection.prepare*()' call with non-constant string JDBCPrepareStatementWithNonConstantString 
'Iterator.hasNext()' which calls 'next()' IteratorHasNextCallsIteratorNext 
'Iterator.next()' which can't throw 'NoSuchElementException' IteratorNextCanNotThrowNoSuchElementException 
'Statement.execute()' call with non-constant string JDBCExecuteWithNonConstantString 
'String.equals("")' StringEqualsEmptyString 
'StringBuffer' may be 'StringBuilder' (JDK 5.0 only) StringBufferMayBeStringBuilder 
'StringBuffer.toString()' in concatenation StringBufferToStringInConcatenation 
'assert' statement AssertStatement 
'assertEquals()' between objects of inconvertible types AssertEqualsBetweenInconvertibleTypes 
'await()' not in loop AwaitNotInLoop 
'await()' without corresponding 'signal()' AwaitWithoutCorrespondingSignal 
'break' statement BreakStatement 
'break' statement with label BreakStatementWithLabel 
'catch' generic class CatchGenericClass 
'clone()' does not call 'super.clone()' CloneDoesntCallSuperClone
8赞 barclay 3/23/2018 #7

对我来说,一个新的最爱是 IntelliJ,当它认为你应该有一个比你使用的更弱的访问修饰符时,它不会抱怨。我们必须对某些方法具有公共访问权限才能支持测试,并且注释不会阻止警告。@SuppressWarnings("WeakerAccess")@VisibleForTesting

伊塔: “匿名者”在@MattCampbell链接到的页面上评论了以下非常有用的注释:

您不需要将此列表用于您的目的 描述。IntelliJ 将为您添加这些 SuppressWarnings 如果您要求它,则自动。它已经能够做到这一点 我记得有多少版本。

只需转到出现警告的位置并键入 Alt-Enter 即可 (或者,如果在“检查任务”列表中看到它,请选择它)。 当菜单出现时,显示警告并提供修复它 您(例如,如果警告是“方法可能是静态的”,则“使静态” 是 IntellJ 为您修复它的建议),而不是选择“输入”, 只需使用右箭头按钮即可访问子菜单,该子菜单将具有 “编辑检查配置文件设置”等选项。在 此列表的底部将是诸如“禁止所有检查”的选项 class“、”Suppress for class“、”Suppress for method“,偶尔 “禁止显示语句”。您可能想要其中任何一个 出现在列表的最后。选择其中之一将添加一个 @SuppressWarnings代码的注释(或在某些情况下的注释) 禁止显示相关警告。你不需要猜测是哪个 要添加的注解,因为 IntelliJ 会根据警告进行选择 您选择了。

评论

0赞 Richard Keene 4/6/2023
我遇到了让鼠标悬停并打开“编辑检查配置文件设置”菜单的问题。它是“显示上下文选项”条目旁边的小箭头。
9赞 hb0 1/17/2019 #8

我注意到可以在 IntelliJ 中自动生成//noinspection

  • 确保您在声明之前还没有计划@SuppressWarninigs
  • 现在,您可以在选择警告时按 Alt+Enter 自动生成特定内容,然后使用右箭头键查看 Suppress for ... 选项//noinspection

当我想抑制来自 IntelliJ 的“开关大小写标签太少”警告时,最终来到了这里。我没有找到 IntelliJ @SuppressWarning支持的完整列表,但 //noinspection 为我提供了诀窍。

评论

4赞 JPM 9/25/2019
您也可以为此添加 @SuppressWarnings(“SwitchStatementWithTooFewBranches”)。
0赞 Mickäel A. 2/11/2020
遗憾的是,单击 Alt+Enter 时的 Supress for ... 选项并不总是可用
1赞 Oliver Hausler 5/3/2020
//noinspection SwitchStatementWithTooFewBranches在为我工作之前也是如此。switch
1赞 R Strauss 4/17/2019 #9

如果您使用的是 SonarLint, 尝试上述方法或对整个 Squid 字符串进行类化: @SuppressWarnings(“鱿鱼:S1172”)

3赞 TWiStErRob 10/20/2023 #10

支持值列表的官方来源

  • JSL 9.6.4.5 @SuppressWarnings
  • javac 文档
  • 实际的 CLIjava
    • 爪哇 5-16javac -help -X
    • 爪哇 17-21javac --help-lint
  • 如果您需要较旧的文档,https://javaalmanac.io 似乎是一个很好的参考。
  • 您的 IDE 或静态代码分析器可以理解的任何其他内容。例如
    • Eclipse 还有一些额外的,看起来像 Java 官方的
    • IntelliJ IDEA 具有可以以相同方式抑制的检查。
    • Checkstyle、PMD 等也可以使用相同的注解。

javac -Xlint跨 JDK 版本的选项

基于上述内容,这里是来自 Oracle/OpenJDK JDK 的官方列表。

名字 因为* 描述
5 启用所有警告
没有 6 禁用所有警告
预览 11
17标准
警告使用预览语言功能。
辅助类 8 警告隐藏在源文件中并从其他文件使用的辅助类。
6 警告不要使用不必要的强制转换。
类文件 7 警告与类文件内容相关的问题。
折旧 5
11标准
警告使用已弃用的项目。
德安 7 对在 JavaDoc 中标记为已弃用但未使用 @Deprecated 注释的项目发出警告。
迪夫泽罗 6 警告除以常数整数 0。
6 警告 if 之后的空语句。
出口 17 警告有关模块导出的问题。
跌落 5 警告不要从 switch 语句的一种情况下降到另一种情况。
最后 5 警告不正常终止的 finally 子句。
有损转换 21 警告复合分配中可能出现的有损转换。
缺少显式 CTOR 17 警告公共中缺少显式构造函数,导出包中缺少受保护的类。
模块 9 警告模块系统相关问题。
打开 9 警告有关模块打开的问题。
选项 7 警告与使用命令行选项有关的问题。
输出文件冲突 21 当输出文件在编译过程中被覆盖时发出警告。例如,在不区分大小写的文件系统上,可能会发生这种情况。涵盖类文件、本机头文件和源文件。
重载 8 警告有关方法重载的问题。
重写 6 警告有关方法重写的问题。
路径 5 警告命令行上的无效路径元素。
加工 7 警告有关批注处理的问题。
原始类型 7 警告使用原始类型。
免职 9
11标准
警告使用已标记为删除的 API。
要求自动 9 警告在 requires 子句中使用自动模块。
requires-transitive-automatic 9 警告 requires transitive 中的自动模块。
串行 5 对没有 serialVersionUID 字段的 Serializable 类发出警告。此外,警告 Serializable 和 Externalizable 类和接口中的其他可疑声明。
静态的 7 警告使用实例访问静态成员。
严格FP 17 警告不必要地使用 strictfp 修饰符。
同步 17 对基于值的类的实例进行同步尝试发出警告。
文本块 17 警告文本块缩进中的空白字符不一致。
这个逃生 21 当构造函数调用可能在外部子类中重写的方法时发出警告。这样的方法将在子类构造函数完成其初始化之前执行。
尝试 7 警告与使用 try 块(即 try-with-resources)相关的问题。
猖獗 5
6标准
对未经检查的操作发出警告。
瓦拉格斯 7 警告可能不安全的 vararg 方法。

* 我只检查了常见的 5、6、7、8、9、11、17、21 版本。
根据 JLS 版本演变,标准是标准的。