【问题标题】:Why I am getting java.lang.AbstractMethodError errors?为什么我收到 java.lang.AbstractMethodError 错误?
【发布时间】:2013-07-31 22:02:49
【问题描述】:

ABstractMethodError 的可能原因是什么?

线程“pool-1-thread-1”java.lang.AbstractMethodError 中的异常:

org.apache.thrift.ProcessFunction.isOneway()Z
    at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:51)
    at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
    at com.gemfire.gemstone.thrift.hbase.ThreadPoolServer$ClientConnnection.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

【问题讨论】:

  • 给我们一些背景,你想做什么?可能是版本问题!您调用的方法或其他代码调用的方法现在已转换为抽象方法。
  • 我正在试用 hbase thrift 版本。我构建了 thrift 编译器并生成了 thrift 文件。并使用 mvn 构建我的项目,该项目也在下载 0.9.0 版本的 apache thrift jars。这和我用的一样。

标签: java thrift


【解决方案1】:

这通常意味着您使用的是旧版本的接口实现,缺少新的接口方法。例如 java.sql.Connection 接口在 1.7 中得到了一个新的 getSchema 方法。如果你有 1.6 的 JDBC 驱动并调用 Connection.getSchema 你会得到 AbstractMethodError。

【讨论】:

  • 很好,你让我在“旧版本的界面”
  • 最近遇到了这个异常。这正是原因 - 运行时组件之间的接口不兼容。更多细节可以参考异常的javadoc。
【解决方案2】:

简单的答案是:一些代码试图调用声明为abstract 的方法。抽象方法没有主体,无法执行。由于您提供的信息太少,我无法详细说明这是如何发生的,因为编译器通常会发现这个问题 - as described here, this means the class must have changed at runtime.

【讨论】:

  • 是的,方法被定义为抽象的,但我通过 Eclipse 进行了跟踪,发现方法是在子类中实现的
  • 当然,但这意味着您必须调用特定的子类实现。你仍然不能调用方法本身。
  • 我再次检查,Apache thrift 生成的代码正在调用子对象特定的实现
  • 请仔细检查。如果您仍然确定,请使用完整的、可重现的测试用例打开 JIRA 票证。
【解决方案3】:

来自AbstractMethodError的文档

当应用程序尝试调用抽象方法时抛出。一般, 这个错误被编译器捕获;此错误只能在运行时发生 如果某个类的定义从那时起发生了不兼容的更改,则时间 当前执行的方法是最后一次编译的。

【讨论】:

    【解决方案4】:

    上述answer的一种特例。

    我遇到了这个错误,因为我使用的是spring-boot-starter-parent(例如2.1.0.RELEASE 使用弹簧版本:5.1.2.RELEASE)但我包含了一个BOM,它也定义了一些弹簧依赖项,但在旧版本中(例如5.0.9.RELEASE)。

    所以要做的一件事是检查您的dependency tree(在 Eclipse 中,例如,您可以使用依赖层次结构)如果您使用的是相同的版本。

    因此,一种解决方案可能是升级 BOM 中的 spring 依赖项,另一种可能是排除它们(但取决于数量,这可能很难看)。

    【讨论】:

    • 感谢“检查你的依赖树”
    【解决方案5】:

    如果您下载任何项目的 zip 文件,解压并导入 Android Studio 后,您将无法运行该项目,因为发生此错误。

    我通过删除我的 android studio 解决了这个问题,然后下载并安装了新版本。

    我真的希望它有所帮助。

    【讨论】:

      【解决方案6】:

      如果您在实现的方法上遇到此错误,请确保您已按照this thread 中的说明正确添加了依赖项。

      【讨论】:

        【解决方案7】:

        正如达米安所说:

        通常,编译器会捕获此错误;这个错误只能 如果 [...]

        在运行时发生

        我遇到了编译器未捕获但在运行时捕获的相同错误。为了解决这个问题,我只重新编译,没有对代码进行任何修改。

        【讨论】:

          【解决方案8】:

          如果您在使用 Proguard 的缩小版本中遇到此错误,请检查该类是否为 POJO 类,如果是,则使用以下规则将其从 Proguard 中排除:

          -keep class your.application.package.pojo.** {*;}

          【讨论】:

            【解决方案9】:

            当我将 eclipse 项目导入 intellij ide 时,我遇到了同样的错误。我尝试在没有 .iml 文件的情况下导入它,然后我的问题解决了

            【讨论】:

              猜你喜欢
              • 2011-08-29
              • 1970-01-01
              • 2020-11-05
              • 2015-01-30
              • 2014-02-10
              • 2015-06-27
              • 1970-01-01
              • 2018-05-22
              • 1970-01-01
              相关资源
              最近更新 更多