NoSuchFieldError בג'אווה

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

במאמר זה נדגים את הסיבה לכך NoSuchFieldError ולגלות כיצד לפתור את זה.

2. NoSuchFieldError

כמו שהשם מרמז, NoSuchFieldError מתרחש כאשר שדה מוגדר אינו קיים. NoSuchFieldError מרחיב את IncompatibleClassChangeError כיתה ונזרק כאשר היישום מנסה לגשת או לשנות שדה של אובייקט או שדה סטטי של מחלקה אך לאובייקט או למחלקה כבר אין שדה זה.

IncompatibleClassChangeError הכיתה מרחיבה את LinkageError בכיתה ומתרחש כאשר אנו מבצעים שינויים לא תואמים בהגדרת הכיתה. סוף כל סוף, LinkageError מרחיב שְׁגִיאָה ומראה שלכיתה יש תלות מסוימת במעמד אחר שאינו משתנה.

בואו נראה את השגיאה הזו בפעולה בעזרת דוגמה. כצעד ראשון, בואו ליצור a תלות מעמד:

מעמד ציבורי תלות {public static String String = "שלום באלדונג !!"; }

ואז ניצור FieldErrorExample כיתה המתייחסת לשדה שלנו תלות מעמד:

מחלקה ציבורית FieldErrorExample {מחרוזת סטטית ציבורית getDependentMessage () {return Dependency.message; }}

בואו נוסיף קוד כדי לבדוק אם אנחנו מקבלים קוד הוֹדָעָה מ ה תלות מעמד:

בטל סטטי ציבורי fetchAndPrint () {System.out.println (getDependentMessage ()); } 

כעת נוכל לאסוף קבצים אלה באמצעות ה- ג'אוואק פיקוד, ועם ביצועו של FieldErrorExample בשיעור באמצעות ג'אווה הפקודה, היא תדפיס את המצוין הוֹדָעָה.

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

לדוגמה, בואו נשנה את שם המאפיין שלנו תלות מעמד:

מחלקה ציבורית תלות {מחרוזת סטטית ציבורית msg = "שלום באלדונג !!"; }

עכשיו, אם נרכיב מחדש רק את שלנו תלות מעמד, ואז לבצע FieldErrorExample שוב ניפגש עם NoSuchFieldError:

חריג בשרשור "ראשי" java.lang.NoSuchFieldError: הודעה

השגיאה שלעיל התרחשה מכיוון ש- FieldErrorExample class עדיין מתייחס לשדה הסטטי הוֹדָעָה של ה תלות בכיתה, אך היא כבר לא קיימת - ביצענו שינוי לא תואם תלות מעמד.

3. פתרון השגיאה

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

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

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

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

4. מסקנה

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

כמו תמיד, הקוד זמין ב- GitHub.


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