Java中的AbstractMethodError
- java
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
,並且對這個錯誤有充分的了解,我們就可以快速解決問題。