Java Lint 工具(JDK1.5环境下的 -Xlint:unchecked 的解决方式)

 

 Java Lint 工具 Stephen Suen 

Copyright (c) 2005 Stephen Suen. All rights reserved. 

如果你在编译 Java 程序时,碰到类似"注意: 要了解详细信息,请使用 -Xlint:deprecation 重新编译"这样的提示,而且你对选项 
-Xlint 感到困惑的话,本文或许会带给你一些有趣且有用的信息。 

本文的最新版本将发布在程序员咖啡馆 
<http://www.programmercafe.com/>网站上(建设中)。欢迎订阅我们的邮件组<http://groups.google.com/group/programmercafe
,以获得关于本文的正式发布及更新信息。全文在保证完整性,且保留全部版权声明(包括上述链接)的前提下可以在任意媒体转载——须保留此标注。 

------------------------------ 
  *目录* 1. 简介 2. Lint 3. Java Lint 选项 
 1. 简介 

如果你已经开始使用 JDK 1.5(或者称为 JDK 5.0),那么你很可能在编译时,已经看到过类似如下的警告信息: 

注意: E:/sandbox/src/DefaultController.java 使用或覆盖了已过时的 API。 
注意: 要了解详细信息,请使用 -Xlint:deprecation 重新编译。 

或者这个: 

注意: E:/sandbox/src/DefaultController.java 使用了未经检查或不安全的操作。 
注意: 要了解详细信息,请使用 -Xlint:unchecked 重新编译。 

这些警告不难理解。如果愿意,只要按照提示在编译时指定相应的选项就可以了。可是,如果你也像我一样,困惑于这个编译选项中晦涩的英文(-Xlint),以至于 经常要借助参考手册才能想起这个选项的用词或者拼写,那么这篇短文或许对你有些帮助。 
 2. Lint 

在介绍这些关于警告的选项前,我们先看看 lint 究竟是什么。在英文中,lint 
是指纠缠在一起的细小纤维或者绒毛,比如衣物上面起的毛或者线头。咋看起来,这个词用在 Java 
编译器选项中,似乎有点风马牛不相及。但是如果你知道一个古老的 Unix 工具被命名为 lint(1),那就另当别论了。 

在 Unix 中,实用工具 lint(1) 
用于在对程序编译的过程中,对程序进行更为细致的额外检查,比如使用未经初始化的变量等常见的编程问题。如此命名该工具,正是借用了"lint" 
一词的含义:将"lint"从程序中挑拣出来,从而使程序更"干净"。 

现在我们至少对选项中的 "lint" 有了一些有趣的认识了,记住这个词应该问题不大了。随后,我们将简单地了解一下 Java 的 lint 
工具。当然,因为 lint 工具当然会涉及到语言规范中的一些知识,而这篇短文显然不适合阐述这些知识。如果对相关内容有兴趣,可以参考其它资料。 
 3. Java Lint 选项 

Java 编译器的选项包括所谓的标准选项和非标准选项。标准选项是指在当前版本的开发环境中支持,且在未来版本中也将被支持的选项。常用的标准选项比如 
-classpath 以及 -d 等等。 

非标准选项是在当前版本的开发环境中支持,但不能保证将来一定会继续支持的选项。非标准选项都由 -X 开头,比如我们这里所关心的 Java Lint 
选项都由 -Xlint 开头。需要先说明的是,单纯的选项 -X 本身是一个标准选项,作用是显示关于非标准选项的信息。参考这个例子: 

E:/>javac -X 
  -Xlint                     启用建议的警告 
  -Xlint:{all,deprecation,unchecked,fallthrough,path,serial,finally,-deprecat ion 
,-unchecked,-fallthrough,-path,-serial,-finally}启用或禁用特定的警告 
  -Xbootclasspath/p:<路径>     置于引导类路径之前 
  -Xbootclasspath/a:<路径>     置于引导类路径之后 
  -Xbootclasspath:<路径>       覆盖引导类文件的位置 
  -Djava.ext.dirs=<目录>       覆盖安装的扩展目录的位置 
  -Djava.endorsed.dirs=<目录>  覆盖签名的标准路径的位置 
  -Xmaxerrs <编号>             设置要输出的错误的最大数目 
  -Xmaxwarns <编号>            设置要输出的警告的最大数目 
  -Xstdout <文件名>             重定向标准输出 

这些选项都是非标准选项,如有更改,恕不另行通知。 

我们依次来看看其中涉及 lint 的选项: 

 -Xlint 

启用所有警告。该选项相当于 -Xlint:all 选项。相反,关闭所有警告的选项为 -Xlint:none。 
-Xlint:unchecked 

启用对所谓的未经检查的转换(unchecked warning)的警告。这个警告涉及 JDK 5.0 中的新特性——范型(Generic 
Type),这绝对是另外一个故事了。有兴趣的话,可以在 Internet 上搜索到很多关于范型的文章。 
-Xlint:path 

当发现不存在的路径或者目录时给出警告,比如标准选项中的类路径(classpath),源代码路径(sourcepath)等等。 
-Xlint:serial 

当在可序列化的类中没有发现 serialVersionUID 的定义时,给出警告。 
Xlint:finally 

当发现 finally 子句无法正常结束的情况时给出警告。比如下面这段代码: 

try { 

 

} catch (Exception e) { 
} finally { 
    for (;;); 
-Xlint:fallthrough 

当在 switch 语句块中发现 fall-through 的情形时给出警告。这里所说的 fall-through 情形指的是在 
switch语句块中,除了最后一个 
case 之外的其它 case 中没有包含 break 语句,导致执行代码时从一个 case 直接穿过执行到了下一个 case 中。比如下面这段代码: 

switch (color) { 
case GREEN: 
        System.out.println("green"); 
        // 没有 break 语句;fall-through 
case RED: 
        System.out.println("red"); 
        break; 
case YELLOW: 
        System.out.println("yellow"); 

 

-Xlint:deprecation 

显示关于使用了过时的 API 的详细信息。这个选项等同于一个我们熟悉的标准选项,即 -deprecation 选项。相对其它 lint 
选项而言,该选项的特别之处在于,即使你关闭了它,编译器仍然会简单地提醒你某个类中使用了过时的 API。只是启用该项警告时,显示的信息将更详细而以。 

上面提到的这些 lint 选项中的警告名称(冒号后面的部分),可以加以组合,从而有选择的开启或者关闭特定的一组 lint 警告选项,比如 
-Xlint:deprecation, 
finally 表示开启 deprecation 和 finally 警告。还可以在警告名称前加上"-"表示关闭该项警告,比如 
-Xlint:all,-unchecked 表示开启除了 unchecked 之外的所有警告。 

关于 Java 编译器命令的完整参考请见 javac - Java programming language 
compiler<http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javac.html>。 

-- 
Stephen Suen 
stephen.s...@gmail.com 
http://spaces.msn.com/members/stephensuen 
http://groups.google.com/group/programmercafe 

 

### Gradle 配置完成后如何消除 Deprecated API 和 Unchecked 操作警告 当在 Android 开发过程中遇到 `Deprecated API` 或者 `Unchecked Operation` 的警告时,可以通过调整 Gradle 配置来处理这些问题。以下是具体的解决方案: #### 一、通过 AAPT Options 屏蔽特定警告 如果某些警告无法被屏蔽,则可以在 `build.gradle (app)` 文件中的 `android {}` 块内添加如下两行代码[^1]: ```groovy aaptOptions { cruncherEnabled = false useNewCruncher = false } ``` 这会禁用资源压缩器的新实现方式,从而可能减少部分与资源相关的警告。 --- #### 二、启用 `-Xlint` 编译参数以显示更多细节 为了更清楚地定位哪些地方存在过时的 API 或未检查的操作,可以向项目的 `gradle.build` 中添加以下配置[^2][^3]: ```groovy allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" options.compilerArgs << "-Xlint:deprecation" } } } ``` 这段代码的作用是,在编译期间开启 Java 编译器的额外检查功能,具体含义如下: - **`-Xlint:unchecked`**: 提醒开发者注意泛型中可能出现的未经检查转换的情况。 - **`-Xlint:deprecation`**: 显示任何使用了已废弃方法或类的位置。 --- #### 三、针对 Deprecation Warning 进行修复 一旦启用了上述选项并重新构建项目后,可能会看到详细的警告信息指出哪一部分代码存在问题。此时应逐一排查这些位置,并考虑替换为推荐使用的替代方案[^4]。例如: - 如果某个库的方法已被标记为 @Deprecated ,查阅官方文档寻找新的接口定义; - 对于内部逻辑设计不当引发的 unchecked warning, 则需改进数据结构声明方式(比如显式指定类型参数而非 raw type)。 --- #### 四、完全忽略警告(不建议) 如果不希望频繁受到此类提醒干扰开发流程,也可以选择彻底关闭它们。不过这种做法通常只适用于非常特殊的情况下才采用。要全局抑制所有 lint 类别的消息输出,请尝试下面这种方法: ```groovy android { ... defaultConfig { javaCompileOptions.annotationProcessorOptions.arguments += ["ignoreWarnings": "true"] } } ``` 需要注意的是,这样做虽然可以让界面看起来干净许多,但实际上隐藏了一些潜在风险点,因此并不提倡作为长期策略实施下去。 --- ### 示例代码片段总结 最终完整的 `build.gradle(app)` 可能类似于这样: ```groovy android { ... aaptOptions { cruncherEnabled = false useNewCruncher = false } } allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-Xlint:unchecked" options.compilerArgs << "-Xlint:deprecation" } } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值