Java @SuppressWarnings注解及其使用

Java @SuppressWarnings 注解用来抑制编译器的警告信息,它除了会作用于当前被修饰的元素(类、方法、变量等),还会作用于当前元素的所有子元素。

例如,现在有一个 Demo 类,它包含了一个 func() 方法,我们先使用 @SuppressWarnings 修饰 Demo 类,让它抑制编译器的某种警告,然后又使用 @SuppressWarnings 修饰 func() 方法,让它抑制编译器的另外一种警告,那么 func() 方法将会同时抑制两种警告。

编译器警告会显示在代码左侧的边栏,这有时候会遮挡我们在调试过程中设置的断点,@SuppressWarnings 主要用来抑制这些警告。如下图所示:
警告会遮挡断点

如果你确认程序中的警告没有问题,可以不用理会。通常情况下,如果程序中使用没有泛型限制的集合将会引起编译器警告,为了避免这种编译器警告,可以使用 @SuppressWarnings 注解消除这些警告。

注解的使用有以下三种:
  • 抑制单类型的警告:@SuppressWarnings("unchecked")
  • 抑制多类型的警告:@SuppressWarnings("unchecked","rawtypes")
  • 抑制所有类型的警告:@SuppressWarnings("unchecked")

抑制警告的关键字如下表所示。

关键字 用途
all 抑制所有警告
boxing 抑制装箱、拆箱操作时候的警告
cast 抑制映射相关的警告
dep-ann 抑制启用注释的警告
deprecation 抑制过期方法警告
fallthrough 抑制在 switch 中缺失 breaks 的警告
finally 抑制 finally 模块没有返回的警告
hiding 抑制相对于隐藏变量的局部变量的警告
incomplete-switch 忽略不完整的 switch 语句
nls 忽略非 nls 格式的字符
null 忽略对 null 的操作
rawtypes 使用 generics 时忽略没有指定相应的类型
restriction 抑制禁止使用劝阻或禁止引用的警告
serial 忽略在 serializable 类中没有声明 serialVersionUID 变量
static-access 抑制不正确的静态访问方式警告
synthetic-access 抑制子类没有按最优方法访问内部类的警告
unchecked 抑制没有进行类型检查操作的警告
unqualified-field-access 抑制没有权限访问的域的警告
unused 抑制没被使用过的代码的警告

使用 @SuppressWarnings 注解示例代码如下:
class Demo{
    @SuppressWarnings({ "deprecation" })
    public static void main(String args[]){
        Website w = new Website();
        w.setNameAndAge("www.weixueyuan.net", 7);
        w.name = "www.baidu.com";
    }
}
在 Eclipse 显示如下图所示:
警告信息不再显示

上述代码第 2 行使用 @SuppressWarnings({ "deprecation" }) 注解了 main 方法。在《Java @Deprecated注解》一节中的 Website 代码中,这些 API 已经过时了,所以代码第 4~6 行是编译警告,但是在使用了 @SuppressWarnings 注解之后会发现程序代码的警告没有了。