在代码编译过程中遇到警告消息“使用或重写已弃用的 API”

2022-09-01 19:11:16

我编译了我的程序,我得到了以下错误。我应该如何解决?

Note: ClientThreadClients.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

答案 1

您应该做的是按照警告消息所说的去做。使用该选项重新编译该类。然后,编译器将告诉您正在使用或重写的已弃用 API。-Xlint:deprecation

如何做到这一点?

  • 如果您使用命令 shell 进行编译,只需将该选项添加到命令行即可。javac-Xlint:deprecation

  • 对于 Maven 构建,请按如下方式运行 maven:

    mvn clean install -Dmaven.compiler.showDeprecation=true
    
  • 对于 Gradle 构建,请将以下内容添加到根构建文件中:

    allprojects { 
        tasks.withType(JavaCompile) { 
            options.deprecation = true
        }
    }
    

    或在特定编译任务上设置选项。

  • 对于 Ant 构建,请在任务中将属性设置为 。deprecationtruejavac

  • 对于 IDE:


确定导致问题的 API 后,有三种方法可以“解决”错误。

  1. 您可以阅读已弃用 API 的 javadocs,以找出它不推荐使用的原因。然后,根据javadocs所说的内容和上下文,您需要找到一种方法,将代码对已弃用元素的使用替换为更好的内容。

  2. 您可以使用注释告诉编译器对此“保持安静”。@SuppressWarnings("deprecation")

    这通常是一个坏主意:

    • 已弃用的 API 可能会在将来的版本中被删除,这将阻止您的代码在升级时运行。(建议您查看有关删除已弃用 API 的产品策略。

    • 已弃用的 API 可能存在根本性缺陷,在某些情况下会使您的应用程序不可靠。

    对这些警告的不公正压制只是创造了技术部门,您或您的继任者将来必须解决。

  3. 如果弃用警告是由于 Java SE 本身或您正在使用的第三方 API 中的更改引起的,则可以通过回滚到未显示警告的版本来“解决”它。这甚至比前一个更糟糕的想法。通过回滚,您只是让技术部门积累。


(对于这个特定示例,我的猜测是 OP 使用了 Thread 类中已弃用的方法之一:

  • countStackFrames()
  • destroy()
  • pause()
  • resume()
  • stop()
  • stop(Throwable)
  • suspend()

这些方法要么不可靠,要么不安全,要么两者兼而有之,强烈建议您不要使用它们。阅读此说明:“为什么 Thread.stop、Thread.suspend 和 Thread.resume 已弃用?”。


答案 2

步骤 1:找出代码正在使用的已弃用 API。如果使用现代 IDE(eclipse 或类似工具),则弃用的代码将被清楚地标记,通常使用删除线字体。如果从命令提示符编译,请在编译时添加到命令行。-Xlint:deprecation

步骤2.阅读已弃用 API 的文档,了解如何替换它。