AbstractMethodError ב- Java

1. סקירה כללית

לפעמים, אנו עלולים להיתקל תקציר שגיאה בזמן ריצה ביישום שלנו. אם איננו מכירים את השגיאה הזו היטב, ייתכן שייקח זמן מה לקבוע את הגורם לבעיה.

במדריך זה נבחן מקרוב תקציר שגיאה. נבין מה תקציר שגיאה הוא ומתי זה עלול לקרות.

2. מבוא ל תקציר שגיאה

תקציר שגיאה נזרק כאשר יישום מנסה לקרוא לשיטה מופשטת לא מיושמת.

אנו יודעים שאם ישנן שיטות מופשטות לא מיושמות, המהדר יתלונן קודם. לכן, היישום לא ייבנה בכלל.

אנו עשויים לשאול כיצד נוכל להשיג שגיאה זו בזמן הריצה?

ראשית, בואו נסתכל איפה תקציר שגיאה משתלב בהיררכיה של חריגות Java:

java.lang.Object | _java.lang.Trowable | _java.lang.Error | _java.lang.LinkageError | _java.lang.IncompatibleClassChangeError | _java.lang.AbstractMethodError

כפי שההיררכיה לעיל מראה, שגיאה זו היא תת-מחלקה של IncompatibleClassChangeError. כשמו של כיתת האם שלה מרמז, תקציר שגיאה נזרק בדרך כלל כאשר קיימים אי התאמות בין מחלקות מקומפלות או קבצי JAR.

לאחר מכן, בואו נבין כיצד שגיאה זו יכולה לקרות.

3. כיצד עשויה להתרחש שגיאה זו

כשאנחנו בונים יישום, בדרך כלל נייבא כמה ספריות כדי להקל על העבודה שלנו.

נניח, ביישום שלנו, אנו כוללים א baeldung- תור סִפְרִיָה. ה baeldung- תור ספרייה היא ספריית מפרט ברמה גבוהה, המכילה ממשק אחד בלבד:

ממשק ציבורי BaeldungQueue {void enqueue (Object o); דקו אובייקט (); } 

כמו כן, להשתמש ב- BaeldungQueue ממשק, אנו מייבאים א BaeldungQueue ספריית יישום: תור טוב. ה תור טוב בספרייה יש גם מחלקה אחת בלבד:

מחלקה ציבורית GoodQueue מיישמת את BaeldungQueue {@Override Enqueue public voque (Object o) {// יישום} @Override dequeue אובייקט ציבורי () {// יישום}} 

עכשיו, אם שניהם תור טוב ו baeldung- תור נמצאים בכיתה, אנו עשויים ליצור BaeldungQueue למשל ביישום שלנו:

יישום בכיתה ציבורית {BaeldungQueue queue = GoodQueue new (); חלל ציבורי someMethod (אלמנט אובייקט) {queue.enqueue (אלמנט); // ... queue.dequeue (); // ...}} 

בינתיים הכל טוב.

יום אחד, למדנו את זה baeldung- תור גרסה משוחררת 2.0 וכי היא נשלחת בשיטה חדשה:

ממשק ציבורי BaeldungQueue {void enqueue (Object o); דקו אובייקט (); גודל int (); } 

אנחנו רוצים להשתמש בחדש גודל() שיטה ביישום שלנו. לכן, אנו משדרגים את baeldung- תור ספרייה מ 1.0 ל 2.0. עם זאת, אנו שוכחים לבדוק אם קיימת גרסה חדשה של ה- תור טוב ספרייה המיישמת את BaeldungQueue שינויים בממשק.

לכן, יש לנו תור טוב 1.0 ו baeldung- תור 2.0 במסלול הכיתה.

יתר על כן, אנו מתחילים להשתמש בשיטה החדשה ביישום שלנו:

יישום בכיתה ציבורית {BaeldungQueue queue = GoodQueue new (); חלל ציבורי someMethod (אלמנט אובייקט) {// ... int size = queue.size (); // <- AbstractMethodError יושלך // ...}} 

הקוד שלנו יורכב ללא שום בעיה.

עם זאת, כאשר הקו queue.size () מבוצע בזמן ריצה, ו- תקציר שגיאה ייזרק. הסיבה לכך היא ש תור טוב1.0 הספרייה אינה מיישמת את השיטה גודל() בתוך ה BaeldungQueue מִמְשָׁק.

4. דוגמה של עולם אמיתי

דרך הפשוטים BaeldungQueue ו GoodQueue בתרחיש, אנו עשויים לקבל את הרעיון מתי יישום עשוי לזרוק תקציר שגיאה.

בחלק זה נראה דוגמה מעשית של ה- תקציר שגיאה.

java.sql.Connect הוא ממשק חשוב ב- JDBC API. מאז גרסה 1.7, נוספו מספר שיטות חדשות ל- חיבור ממשק, כגון getSchema ().

מסד הנתונים H2 הוא מסד נתונים SQL פתוח מהיר למדי. מאז הגרסה 1.4.192, זה הוסיף את התמיכה של java.sql.Connection.getSchema () שיטה. עם זאת, בגרסאות קודמות, מסד הנתונים H2 עדיין לא יישם שיטה זו.

לאחר מכן, נקרא java.sql.Connection.getSchema () שיטה מיישום Java 8 בגרסת מסד נתונים H2 ישנה יותר 1.4.191. בואו נראה מה יקרה.

בואו ניצור מחלקה לבדיקת יחידה כדי לוודא אם מתקשרים אל Connection.getSchema () שיטה תזרוק תקציר שגיאה:

class AbstractMethodErrorUnitTest {פרטית סטטית סופית מחרוזת url = "jdbc: h2: mem: A-DATABASE; INIT = צור סכימה אם לא קיים myschema"; סופי סטטי פרטי מחרוזת שם משתמש = "sa"; @Test בטל givenOldH2Database_whenCallgetSchemaMethod_thenThrowAbstractMethodError () זורק SQLException {Connection conn = DriverManager.getConnection (url, שם משתמש, ""); assertNotNull (conn); Assertions.assertThrows (AbstractMethodError.class, () -> conn.getSchema ()); }} 

אם נבצע את הבדיקה, זה יעבור, ומאשר שהשיחה אל getSchema () זורק תקציר שגיאה.

5. מסקנה

לפעמים אנו עשויים לראות תקציר שגיאה בזמן ריצה. במאמר זה דנו מתי השגיאה מתרחשת באמצעות דוגמאות.

כאשר אנו משדרגים ספרייה אחת של היישום שלנו, תמיד נוהג לבדוק אם תלות אחרות משתמשות בספריה ולשקול לעדכן את התלות הקשורות.

מצד שני, ברגע שאנחנו מתמודדים תקציר שגיאה, עם הבנה טובה של שגיאה זו, אנו עשויים לפתור את הבעיה במהירות.

כמו תמיד, קוד המקור המלא של המאמר זמין באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found