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


264

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

介于之间的("")@SuppressWarnings("")


3
这个问题真的很好,答案也很有用。如果JCP中的某人看了它,您应该意识到添加抑制警告是多么混乱。没有关于大小写,连字符,驼峰式大小写的约定,这只是一个混乱的地方,将其标准化很可爱。
Snicolas

"ProhibitedExceptionDeclared"在Eclipse Collections Framework(org.eclipse.collections.impl.block.function.checked.ThrowingFunction)中看到了,下面没有列出。
kevinarpe

Answers:


250

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

以下是Eclipse Galileo 的列表

  • 全部禁止所有警告
  • 装箱以取消有关装箱/拆箱操作的警告
  • 投射以取消与投射操作有关的警告
  • dep-ann抑制相对于已弃用注释的警告
  • 弃用以抑制与弃用有关的警告
  • 故障排除以抑制与switch语句中缺少中断有关的警告
  • 最终抑制相对于不会返回的最终阻止的警告
  • 隐藏隐藏相对于隐藏变量的本地人的警告
  • incomplete-switch禁止显示与switch语句中缺少条目有关的警告(枚举情况)
  • nls抑制相对于非nls字符串文字的警告
  • null禁止显示有关null分析的警告
  • 限制显示关于使用不推荐或禁止使用的参考的警告
  • serial禁止显示有关可序列化类的缺少serialVersionUID字段的警告
  • 静态访问以抑制与错误的静态访问相关的警告
  • 综合访问以抑制与来自内部类的未优化访问有关的警告
  • 未选中以禁止显示与未选中操作相关的警告
  • unqualified-field-access禁止显示有关非合格字段访问的警告
  • 未使用以禁止显示有关未使用代码的警告

靛蓝清单添加:

  • javadoc抑制相对于javadoc警告的警告
  • rawtypes抑制与原始类型的使用有关的警告
  • static-method禁止显示相对于可以声明为static的方法的警告
  • 用super来抑制与覆盖没有super调用的方法有关的警告

朱诺列表添加:

  • 资源,以抑制有关Closeable类型的资源使用的警告
  • sync-override抑制警告,因为在覆盖同步方法时缺少同步

开普勒和露娜使用与朱诺(list)相同的令牌列表。

其他将类似,但有所不同。


在什么情况下抑制空警告有用?
杰西·雅辛斯基

@Jesse:编译器错误时(即“'愚蠢的法兰德斯'警告”)。尝试编译:void foo( Object o ) { boolean b; if ( ( b = o == null ) ) o = new Object(); o.toString(); }。某些环境(例如带有Java 6 JDK [1.6.0_41]的NetBeans 7.3)将"o possibly null"o.toString()调用时生成,即使此时o不能为null。

2
@cletus:是否可以在日食中添加警告类型?问题是我们的团队成员之一使用IntelliJ,并且IDE具有其他抑制警告类型,这些警告类型会在Eclipse中发出警告:)在Eclipse Indigo中,您可以设置首选项:忽略未使用的SuppressWarnings令牌,但这似乎不起作用...
KC

semicolon似乎在月神不起作用?:(有人可以验证是否semicolon确实有效吗?
Kissaki 2014年

禁止“非最终字段同步”警告的意义是什么?
matteo 2014年

48

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

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

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

Java语言规范中定义它们的特定部分在各个版本之间不一致。在Java SE 8 Specification中uncheckeddeprecation9.6.4.5节中列为编译器警告@SuppressWarnings9.6.4.6 @Deprecated

对于Sun的编译器,运行javac -X给出了该版本可识别的所有值的列表。对于1.5.0_17,列表似乎是:

  • 所有
  • 弃用
  • 未检查
  • 失败
  • 路径
  • 连载
  • 最后

43

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

  • allDeprecation 即使在已弃用的代码中也已弃用
  • allJavadoc 无效或缺少javadoc
  • assertIdentifier 出现断言用作标识符
  • 拳击 自动装箱转换
  • 当在字符串连接中使用char数组而不将其显式转换为字符串时,使用 charConcat
  • conditionAssign 可能的意外布尔分配
  • 具有构造函数名称的constructorName方法
  • dep-ann 缺少@Deprecated注释
  • 不推荐 使用的类型或成员在不推荐使用的代码之外的不推荐使用
  • 不鼓励 使用与不受欢迎的访问规则匹配的类型
  • emptyBlock 未记录的空块
  • enumSwitch不完整开关 不完整的枚举开关
  • 通电路 可能的下通案
  • 隐藏 字段隐藏另一个变量
  • 具有最终边界的finalBound类型参数
  • 终于 终于阻止了无法正常完成
  • 禁止 使用与禁止访问规则匹配的类型
  • 隐藏 fieldHiding,localHiding,typeHiding和maskedCatchBlock的宏
  • indirectStatic 间接引用静态成员
  • intfAnnotation 注释类型用作超级接口
  • intfNonInherited 接口非继承方法的兼容性
  • javadoc 无效的javadoc
  • localHiding 局部变量隐藏另一个变量
  • maskedCatchBlocks 隐藏的捕获块
  • nls 非nls字符串文字(缺少标签// $ NON-NLS-)
  • noEffectAssign 分配无效
  • 空值 可能丢失或冗余空值检查
  • nullDereference 缺少null检查
  • 过分 缺少@Override注释
  • 参数的paramAssign分配
  • pkgDefaultMethod 尝试覆盖程序包默认方法
  • 原始 类型的原始用法a(而不是参数化类型)
  • 分号 不必要的分号或空语句
  • 序列号 缺少serialVersionUID
  • specialParamHiding 构造函数或setter参数隐藏另一个字段
  • 用于indirectStatic和staticReceiver的静态访问
  • staticReceiver( 如果使用非静态接收器获取静态字段或调用静态方法)
  • 超级 重写方法而不进行超级调用
  • 禁止 启用@SuppressWarnings
  • syntheticAccess,合成的访问 执行对内部类合成访问时
  • 任务 启用对源代码中任务标签的支持
  • typeHiding 类型参数隐藏另一种类型的
  • 检查检查类型操作
  • elseElse 不必要的else子句
  • unqualified-field-access,unqualifiedField 对字段的不合格引用
  • 未使用的 宏,用于未使用的参数,未使用的导入,未使用的标签,未使用的本地,未使用的私有和未使用的抛出
  • usedArgument 未使用的方法参数
  • 导入 未使用的导入参考
  • unusedLabel 未使用的标签
  • unusedLocal 未使用的局部变量
  • unusedPrivate 未使用的私有成员声明
  • unusedThrown 未使用的声明抛出的异常
  • uselessType检查 不必要的强制转换 /实例操作
  • varargsCast varargs参数需要显式 强制转换
  • @SuppressWarnings中的warningToken 未处理的警告令牌

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

  • 折旧 检查使用贬值的物品。
  • unchecked 为Java语言规范所要求的unchecked转换警告提供更多详细信息。
  • serial警告有关可序列化类上缺少serialVersionUID定义。
  • 最后警告无法正常完成的finally子句。
  • 掉线检查开关块是否掉线,并为发现的任何警告消息。
  • path 检查环境路径(例如classpath)中是否存在不存在的路径。

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

  • 所有
  • 弃用
  • divzero
  • 空的
  • 未检查
  • 失败
  • 路径
  • 连载
  • 最后
  • 覆写

此处的Eclipse列表查找编译器标志,而不查找SuppressWarning批注(请检查链接的文档的最后一部分)。
罗恩·塔芬

3
他们都。通过设置编译器标志,您可以告诉编译器您想要哪种警告。使用注释,您可以在代码的特定位置禁止显示这些警告。
D. Wroblewski

我认为Eclipse的列表较短。请参阅最新的galileo文档,其中有SupressWarnings
PeterŠtibraný09年

2
我在Eclipse 3.5中尝试了@SuppressWarnings(“ raw”),但它不起作用-我收到警告,说“ raw”不是此批注的有效值。
杰斯珀,

我也是。不幸的是,对jsp的支持没有像对java的支持那样被淘汰。
stu

9

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

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

您不需要出于描述的目的使用此列表。如果您需要,IntelliJ将自动为您添加那些SuppressWarnings。我记得有很多版本可以做到这一点。

只需转到有警告的位置,然后键入Alt-Enter(或在“检查”列表中选择它,如果在那里看到它)。出现菜单时,显示警告并为您提供解决方案(例如,如果警告为“方法可能是静态的”,则“使静态”是IntellJ为您提供的解决方案),而不是选择“输入”,只需使用向右箭头按钮访问子菜单,该子菜单将具有“编辑检查配置文件设置”等选项。该列表的底部是“禁止对类进行所有检查”,“禁止对类进行检查”,“禁止对方法进行检查”和偶尔“禁止对语句进行声明”之类的选项。您可能希望其中任何一个出现在列表的最后。选择其中之一将在代码中添加@SuppressWarnings批注(在某些情况下为注释),以消除相关警告。您无需猜测要添加的注释,因为IntelliJ会根据您选择的警告进行选择。


2

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

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

当我想取消IntelliJ发出的“开关的案例标签太少”警告时,在这里结束。我没有找到有关IntelliJ @SuppressWarning支持的完整列表,但//noinspection为我找到了窍门。


您也可以为此添加@SuppressWarnings(“ SwitchStatementWithTooFewBranches”)。
JPM

不幸的是,单击ALT + ENTER时,Supress for ...选项并非始终可用
缺陷

//noinspection SwitchStatementWithTooFewBranches之前的switch作品很适合我。
奥利弗·豪斯勒

1

这似乎是一个更完整的列表,在其中我找到了一些我在其他地方找不到的针对Android-Studio的警告(例如SynchronizeOnNonFinalField)

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

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


1

JSL 1.7

Oracle文档提到:

  • unchecked:未检查警告由字符串“未检查”标识。
  • deprecation注意:除非使用以下类型,方法,字段或构造函数,其声明用@Deprecated注释进行注释(即,按名称覆盖,调用或引用),否则Java编译器必须产生弃用警告,除非:[...]使用位于带有注释@SuppressWarnings(“ deprecation”)的禁止显示警告的实体内;要么

然后说明实现可以添加并记录自己的实现:

编译器供应商应将此注释类型与支持的警告名称一起记录下来。鼓励供应商合作以确保相同的名称可在多个编译器中使用。


1
unchecked唯一的标准是不正确的。从你引用了一个非常下一节说,当“使用是被注释以取消与注释的警告实体内的废弃警告不应产生@SuppressWarnings("deprecation")
kbolino

1

我只想补充一点,在以下位置有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

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.