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-queue
。 good-queue
库也只有一个类:
public class GoodQueue implements TutorialQueue {
@Override
public void enqueue(Object o) {
//implementation
}
@Override
public Object dequeue() {
//implementation
}
}
现在,如果good-queue
和tutorial-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.0
和tutorial-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.一个真实的例子
通过简单的TutorialQueue
和GoodQueue
场景,当应用程序可能引发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 评论