拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java中的AbstractMethodError

Java中的AbstractMethodError

白鹭 - 2021-11-24 545 0 0

1.概述

有时,我们可能会在应用程序运行时AbstractMethodError如果我们不太清楚此错误,则可能需要一段时间才能确定问题的原因。

在本教程中,我们将仔细研究AbstractMethodError 。我们将了解什么是AbstractMethodError以及何时可能发生。

2. AbstractMethodError

当应用程序尝试调用未实现的抽象方法时,将引发AbstractMethodError

我们知道,如果存在未实现的抽象方法,则编译器将首先提出投诉。因此,该应用程序将完全无法构建。

我们可能会问,如何在运行时得到此错误?

首先,让我们看一下AbstractMethodError在Java异常层次结构中的适合位置:

java.lang.Object

 |_java.lang.Throwable

 |_java.lang.Error

 |_java.lang.LinkageError

 |_java.lang.IncompatibleClassChangeError

 |_java.lang.AbstractMethodError

如上面的层次结构所示,此错误是IncompatibleClassChangeError的子类。就像其父类的名称所暗示的那样,当已编译的类或JAR文件之间存在不兼容性时AbstractMethodError

接下来,让我们了解如何发生此错误。

3.如何发生此错误

在构建应用程序时,通常我们将导入一些库以使我们的工作更轻松。

假设在我们的应用程序中,我们包含了tutorial-queue库。 tutorial-queue库是一个高级规范库,它仅包含一个接口:

public interface TutorialQueue {

 void enqueue(Object o);

 Object dequeue();

 }

另外,要使用TutorialQueue接口,我们导入TutorialQueue实现库: good-queuegood-queue库也只有一个类:

public class GoodQueue implements TutorialQueue {

 @Override

 public void enqueue(Object o) {

 //implementation

 }



 @Override

 public Object dequeue() {

 //implementation

 }

 }

现在,如果good-queuetutorial-queue都在类路径中,我们可以在应用程序中TutorialQueue

public class Application {

 TutorialQueue queue = new GoodQueue();



 public void someMethod(Object element) {

 queue.enqueue(element);

 // ...

 queue.dequeue();

 // ...

 }

 }

到目前为止,一切都很好。

有一天,我们了解到tutorial-queue发布了2.0版,并附带了一种新方法:

public interface TutorialQueue {

 void enqueue(Object o);

 Object dequeue();



 int size();

 }

我们想在我们的应用程序中使用新的size()因此,我们将tutorial-queue库从1.0升级到2.0 。但是,我们忘记检查是否存在实现TutorialQueue接口更改good-queue

因此,我们在类路径中good-queue 1.0tutorial-queue 2.0

此外,我们开始在应用程序中使用新方法:

public class Application {

 TutorialQueue queue = new GoodQueue();



 public void someMethod(Object element) {

 // ...

 int size = queue.size(); //<-- AbstractMethodError will be thrown

 // ...

 }

 }

我们的代码将毫无问题地进行编译。

但是,当在运行时执行queue.size()行时,将引发AbstractMethodError这是因为good-queue 1.0库未在TutorialQueue接口中size()

4.一个真实的例子

通过简单的TutorialQueueGoodQueue场景,当应用程序可能引发AbstractMethodError.

在本节中,我们将看到AbstractMethodError的实际示例。

java.sql.Connection是JDBC API中的重要接口。从1.7版开始,已向Connection接口添加了几个新方法,例如getSchema() .

H2数据库是一个非常快速的开源SQL数据库。从1.4.192版本开始,它增加了对java.sql.Connection.getSchema()方法的支持。但是,在以前的版本中,H2数据库尚未实现此方法。

接下来,我们将在较旧的H2数据库版本1.4.191 java.sql.Connection.getSchema()方法。让我们看看会发生什么。

让我们创建一个单元测试类,以验证调用Connection.getSchema()方法是否会引发AbstractMethodError

class AbstractMethodErrorUnitTest {

 private static final String url = "jdbc:h2:mem:A-DATABASE;INIT=CREATE SCHEMA IF NOT EXISTS myschema";

 private static final String username = "sa";



 @Test

 void givenOldH2Database_whenCallgetSchemaMethod_thenThrowAbstractMethodError() throws SQLException {

 Connection conn = DriverManager.getConnection(url, username, "");

 assertNotNull(conn);

 Assertions.assertThrows(AbstractMethodError.class, () -> conn.getSchema());

 }

 }

如果我们运行测试,它将通过,确认对getSchema()的调用引发了AbstractMethodError

5.结论

有时我们可能会在运行时AbstractMethodError在本文中,我们通过示例讨论了何时发生错误。

当我们升级应用程序的一个库时,通常最好检查其他依赖项是否正在使用该库并考虑更新相关的依赖项。

另一方面,一旦我们面对AbstractMethodError ,并且对这个错误有充分的了解,我们就可以快速解决问题。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *