【问题标题】:What is the list of valid @SuppressWarnings warning names in Java?Java 中有效的@SuppressWarnings 警告名称列表是什么?
【发布时间】:2010-11-15 09:56:22
【问题描述】:

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

@SuppressWarnings("")("") 之间的位。

【问题讨论】:

  • 这个问题真的很好,答案很有用。如果 JCP 的某个人看到它,您应该意识到添加抑制警告是多么的混乱。大小写、连字符、驼峰大小写没有约定,只是一团糟,如果能将其标准化就好了。
  • 我在 Eclipse Collections Framework (org.eclipse.collections.impl.block.function.checked.ThrowingFunction) 中看到了 "ProhibitedExceptionDeclared",下面没有列出。

标签: java eclipse warnings compiler-warnings suppress-warnings


【解决方案1】:

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

这是 Eclipse Galileo 的 list

  • all 禁止所有警告
  • 装箱以抑制与装箱/拆箱操作相关的警告
  • cast 以抑制与强制转换操作相关的警告
  • dep-ann 抑制与已弃用注释相关的警告
  • 弃用以抑制与弃用相关的警告
  • fallthrough 抑制与 switch 中缺少中断有关的警告 声明
  • finally 抑制与 finally 块相关的警告 返回
  • hiding 以抑制与隐藏变量的本地人相关的警告
  • incomplete-switch 抑制与缺失条目相关的警告 在 switch 语句中(枚举大小写)
  • nls 抑制与非 nls 字符串文字相关的警告
  • null 抑制与 null 分析相关的警告
  • restriction 抑制与使用不鼓励或 禁止引用
  • serial 抑制与缺少的 serialVersionUID 相关的警告 可序列化类的字段
  • static-access 抑制与不正确静态相关的警告 访问
  • synthetic-access 抑制与未优化相关的警告 从内部类访问
  • unchecked 抑制与未经检查的操作相关的警告
  • unqualified-field-access 抑制与字段相关的警告 访问不合格
  • unused 抑制与未使用代码相关的警告

List 为 Indigo 添加:

  • javadoc 抑制与 javadoc 警告相关的警告
  • rawtypes 抑制与使用原始类型相关的警告
  • static-method 抑制与可声明为静态的方法相关的警告
  • super 抑制与在没有超级调用的情况下覆盖方法相关的警告

List 为 Juno 添加:

  • resource 抑制与 Closeable 类型资源的使用相关的警告
  • sync-override 以在覆盖同步方法时抑制因缺少同步而发出的警告

Kepler 和 Luna 使用与 Juno (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.toString() 调用中生成 "o possibly null",即使此时 o 不能为空。
  • @cletus :是否可以在 Eclipse 中添加警告类型?问题是我们的团队成员之一使用 IntelliJ,并且 IDE 具有其他抑制警告类型,这些类型会在 Eclipse 中发出警告:) 在 Eclipse Indigo 中,您可以在首选项中设置:忽略未使用的 SuppressWarnings 令牌,但这似乎不起作用...
  • semicolon 似乎在 luna 中不起作用? :( 有人可以验证semicolon 是否确实有效吗?
  • 链接已损坏
【解决方案2】:

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

The Java Tutorialsuncheckeddeprecation 中列为Java 语言规范要求的两个警告,因此它们应该对所有编译器都有效:

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

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

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

  • 全部
  • 弃用
  • 未选中
  • 失败
  • 路径
  • 串行
  • 终于

【讨论】:

    【解决方案3】:

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

    • allDeprecation 弃用,即使在已弃用的代码中
    • allJavadoc 无效或缺少 javadoc
    • assertIdentifier 出现用作标识符的断言
    • 装箱自动装箱转换
    • charConcat 在字符串连接中使用 char 数组而不显式转换为字符串时
    • conditionAssign 可能的意外布尔赋值
    • constructorName 方法 构造函数名称
    • dep-ann 缺少 @Deprecated 注释
    • 弃用在弃用代码之外使用弃用类型或成员
    • 不鼓励使用与不鼓励的访问规则匹配的类型
    • emptyBlock 未记录的空块
    • enumSwitch, incomplete-switch 不完整的枚举开关
    • 失败可能的失败案例
    • fieldHiding 隐藏另一个变量的字段
    • finalBound 带最终边界的类型参数
    • finally finally 块没有正常完成
    • 禁止使用匹配禁止访问规则的类型
    • hiding 宏,用于 fieldHiding、localHiding、typeHiding 和 maskedCatchBlock
    • indirectStatic 间接引用静态成员
    • intfAnnotation 用作超级接口的注解类型
    • intfNonInherited 接口非继承方法兼容性
    • javadoc 无效的 javadoc
    • localHiding 隐藏另一个变量的局部变量
    • ma​​skedCatchBlocks 隐藏的 catch 块
    • nls 非 nls 字符串文字(缺少标签 //$NON-NLS-)
    • noEffectAssign 没有效果的赋值
    • null 潜在的缺失或多余的 null 检查
    • nullDereference 缺少空检查
    • over-ann 缺少@Override 注释
    • paramAssign 分配给参数
    • pkgDefaultMethod 尝试覆盖包默认方法
    • raw 使用原始类型(而不是参数化类型)
    • 分号不必要的分号或空语句
    • serial 缺少 serialVersionUID
    • specialParamHiding 构造函数或设置器参数隐藏另一个字段
    • static-access 宏用于indirectStatic 和 staticReceiver
    • staticReceiver如果使用非静态接收器获取静态字段或调用静态方法
    • super 覆盖方法而不进行超级调用
    • 抑制启用@SuppressWarnings
    • syntheticAccess,synthetic-access 为内部类执行综合访问时
    • tasks 在源代码中启用对任务标签的支持
    • typeHiding 隐藏其他类型的类型参数
    • 未选中未选中类型操作
    • unnecessaryElse 不必要的 else 子句
    • unqualified-field-access, unqualifiedField 不合格 引用字段
    • unused 用于未使用Argument、unusedImport、unusedLabel、unusedLocal、unusedPrivate 和unusedThrown 的宏
    • unusedArgument 未使用的方法参数
    • unusedImport 未使用的导入参考
    • unusedLabel 未使用的标签
    • unusedLocal 未使用的局部变量
    • unusedPrivate 未使用的私有成员声明
    • unusedThrown 未使用的声明抛出的异常
    • uselessTypeCheck 不必要的强制转换/实例操作
    • varargsCast varargs 参数需要显式转换
    • warningToken @SuppressWarnings 中未处理的警告标记

    Sun JDK (1.6) 的支持警告的 list 较短:

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

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

    • 全部
    • 演员表
    • 弃用
    • divzero
    • 未选中
    • 失败
    • 路径
    • 连载
    • 终于
    • 覆盖

    【讨论】:

    • 此处的 Eclipse 列表查看编译器标志而不是 SuppressWarning 注释(检查您链接的文档的最后一部分)。
    • 两者都是。通过设置编译器标志,您可以告诉编译器您想要什么样的警告。使用注释,您可以在代码中的特定位置禁止这些警告。
    • 我认为 Eclipse 的列表更短。请参阅最新的 galileo 文档,SupressWarnings 的可用令牌列表在此处是明确的:help.eclipse.org/galileo/index.jsp?topic=/…
    • 我在 Eclipse 3.5 中尝试了 @SuppressWarnings("raw") 但它不起作用 - 我收到警告,它“原始”不是此注释的有效值。
    • 我也是。不幸的是,jsp 支持没有像 java 支持那样被淘汰。
    【解决方案4】:

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

    预计到达时间: “匿名”在@MattCampbell 链接到的页面上评论说,以下非常有用的注释:

    您不需要出于您的目的使用此列表 描述。 IntelliJ 将为您添加这些 SuppressWarnings 如果你要求它自动。它已经能够做到这一点 与我记忆中一样多的版本。

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

    【讨论】:

      【解决方案5】:

      我注意到//noinspection 可以在 IntelliJ

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

      当我想抑制来自 IntelliJ 的“开关的大小写标签太少”警告时,这里结束了。我没有找到 IntelliJ 的 @SuppressWarning 支持的完整列表,但 //noinspection 对我有用。

      【讨论】:

      • 您也可以为此添加@SuppressWarnings("SwitchStatementWithTooFewBranches")。
      • 不幸的是,单击 ALT+ENTER 时 Supress for ... 选项并不总是可用
      • //noinspection SwitchStatementWithTooFewBranches 之前的switch 也适用于我。
      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

        JSL 1.7

        The Oracle documentation 提及:

        • unchecked:未经检查的警告由字符串“unchecked”标识。
        • deprecation:当使用带有 @Deprecated 注释的类型、方法、字段或构造函数的声明时(即被名称覆盖、调用或引用),Java 编译器必须产生弃用警告,除非:[.. .] 使用在一个实体内,该实体被注释为使用注释 @SuppressWarnings("deprecation"); 抑制警告;或

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

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

        【讨论】:

        • unchecked 是唯一被标准认可的,这不是真的;你引用的下一节说,当“使用在一个被注释以抑制带有注释@SuppressWarnings("deprecation")的警告的实体内”时,不应产生弃用警告
        【解决方案8】:

        我只是想补充一下,有一个 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
        

        【讨论】:

          【解决方案9】:

          如果您使用的是 SonarLint, 在方法或类之上尝试整个 squid 字符串: @SuppressWarnings("squid:S1172")

          【讨论】:

            猜你喜欢
            • 2021-08-21
            • 1970-01-01
            • 1970-01-01
            • 2012-04-29
            • 1970-01-01
            • 2022-01-07
            • 1970-01-01
            • 2021-10-07
            相关资源
            最近更新 更多