NoSuchMethodError ב- Java

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

במדריך זה, נסתכל על java.lang.NoSuchMethodError וכמה דרכים להתמודד עם זה.

2. NoSuchMethodError

כמו שהשם מרמז, ה NoSuchMethodError מתרחשת כאשר לא נמצאת שיטה מסוימת. שיטה זו יכולה להיות שיטת מופע או שיטה סטטית.

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

לפיכך, אנו עשויים להיתקל בשגיאה זו במקרים הבאים. קוֹדֶם כֹּל, אם נעשה רק הידור מחדש חלקי של הקוד שלנו. שנית, אם יש חוסר תאימות בין הגרסאות לתלות ביישום שלנו, כמו הצנצנות החיצוניות.

שים לב שה- NoSuchMethodError עץ הירושה כולל IncompatibleClassChangeError ו- LinkageError. שגיאות אלה קשורות לשינוי מחלקה לא תואם לאחר ההידור.

3. דוגמה ל NoSuchMethodError

בואו נראה את השגיאה הזו בפעולה עם דוגמה. לשם כך ניצור שתי כיתות. הראשון הוא מיוחד היום אשר יפרט את המבצעים להיום במסעדה:

מעמד ציבורי SpecialToday {מדבר מחרוזת סטטי פרטי = "עוגת שוקולד"; מחרוזת סטטית ציבורית getDesert () {חזרה מדבר; }}

הכיתה השנייה תפריט ראשי קורא שיטות מ מבצעים היום:

class class MainMenu {public static void main (String [] args) {System.out.println ("המבצעים של היום:" + getSpecials ()); } מחרוזת סטטית ציבורית getSpecials () {return SpecialToday.getDesert (); }}

כאן הפלט יהיה:

המבצעים של היום: עוגת שוקולד

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

חריג בשרשור "ראשי" java.lang.NoSuchMethodError: SpecialToday.getDesert () Ljava / lang / String;

4. כיצד לטפל NoSuchMethodError

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

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

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

עם זאת, אם אנו עדיין נתקלים בשגיאה זו בזמן הריצה, נצטרך להעמיק יותר. נצטרך ודא שלשיעורי הקומפיליישן והמחזור Runtime יש גרסאות זהות. בשביל זה אנחנו יכולים הפעל את היישום עם -verbose: אפשרות מחלקה כדי לבדוק את הכיתות הטעונות. אנו יכולים להפעיל את הפקודה באופן הבא:

$ java -verbose: class com.baeldung.exceptions.nosuchmethoderror.MainMenu [0.014s] [info] [class, load] שנפתח: / usr / lib / jvm / java-11-openjdk-amd64 / lib / modules [0.015s ] [מידע] [מחלקה, טעינה] נפתח: /usr/share/java/java-atk-wrapper.jar [0.028s] [info] [class, load] java.lang. מקור נושא: קובץ אובייקטים משותפים [0.028s ] [מידע] [מחלקה, טעינה] java.io. מקור ניתן לסידור: קובץ אובייקטים משותפים

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

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

תלות $ mvn: עץ [INFO] סריקה לפרויקטים ... [INFO] [INFO] --------------------------- [INFO] בניית nosuchmethoderror 0.0.1-SNAPSHOT [INFO] -------------------------------- [jar] ----- ---------------------------- [INFO] [INFO] --- תוסף תלות של maven: 2.8: עץ (ברירת מחדל של cli ) @ nosuchmethoderror --- [INFO] com.baeldung.exceptions: nosuchmethoderror: jar: 0.0.1-SNAPSHOT [INFO] \ - org.junit: junit-bom: pom: 5.7.0-M1: compile

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

5. מסקנה

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

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


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