NullPointerExceptions מועילים ב- Java 14

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

במדריך זה נמשיך את הסדרה שלנו ב- Java 14 על ידי הסתכלות ב- Helpful NullPointerExceptions, שהיא תכונה חדשה שהוצגה עם גרסה זו של ה- JDK.

2. מסורתי NullPointerExceptionס

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

נניח שאנחנו רוצים לברר את כתובת הדוא"ל של העובד:

מחרוזת emailAddress = employee.getPersonalDetails (). GetEmailAddress (). ToLowerCase ();

אם ה עוֹבֵד לְהִתְנַגֵד, getPersonalDetails () אוֹ getEmailAddress () הוא ריק, ה- JVM זורק א NullPointerException:

חריג בשרשור "ראשי" java.lang.NullPointerException ב com.baeldung.java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

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

בחלק הבא נבדוק כיצד Java 14, באמצעות JEP 358, תפתור בעיה זו.

3. מועיל NullPointerExceptionס

SAP יישמה מועיל NullPointerExceptionב- JVM המסחרי שלהם בשנת 2006. הוא הוצע כשיפור לקהילת OpenJDK בפברואר 2019, ומהר אחר כך הוא הפך ל- JEP. כתוצאה מכך, התכונה הסתיימה ונדחקה באוקטובר 2019 לשחרור JDK 14.

למעשה, JEP 358 שואף לשפר את הקריאות של NullPointerExceptions, שנוצר על ידי JVM, על ידי תיאור איזה משתנה הוא ריק.

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

הכי חשוב, הודעת החריגה המפורטת כבויה כברירת מחדל ב- JDK 14. כדי לאפשר זאת, עלינו להשתמש באפשרות שורת הפקודה:

-XX: + ShowCodeDetailsInExceptionMessages

3.1. הודעת חריגה מפורטת

בואו נשקול להריץ את הקוד שוב עם ה- ShowCodeDetailsInExceptionMessages הדגל הופעל:

חריג בשרשור "ראשי" java.lang.NullPointerException: לא ניתן להפעיל את "String.toLowerCase ()" מכיוון שערך ההחזרה של "com.baeldung.java14.npe.HelpfulNullPointerException $ PersonalDetails.getEmailAddress ()" הוא אפס ב- com.baeldung. java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

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

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

לא ניתן להפעיל את "String.toLowerCase ()" מכיוון שערך ההחזרה של "getEmailAddress ()" הוא null

לבניית ההודעה החריגה, JEP 358 משחזר את החלק של קוד המקור שדחף את ה- ריק התייחסות אל ערימת האופרנד.

3.2. היבטים טכניים

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

קוֹדֶם כֹּל, חישוב הודעות מפורט נעשה רק כאשר ה- JVM עצמו זורק a NullPointerException החישוב לא יבוצע אם נזרוק במפורש את החריג בקוד הג'אווה שלנו. הסיבה מאחורי זה היא שבמצבים אלה, ככל הנראה, אנו כבר מעבירים מסר משמעות בבנאי החריג.

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

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

שקול דוגמה פשוטה שקיבצנו כדי לכלול מידע נוסף בנושא ניפוי באגים:

עובד שכיר = אפס; employee.getName ();

כאשר אנו מריצים קוד זה, הודעת החריג מדפיסה את שם המשתנה המקומי:

לא ניתן להפעיל את "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" מכיוון ש"עובד "אינו פעיל

לעומת זאת, ללא מידע נוסף על ניפוי באגים, ה- JVM מספק רק את מה שהוא יודע על המשתנה בהודעה המפורטת:

לא ניתן להפעיל את "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" מכיוון ש "" אינו פעיל

במקום שם המשתנה המקומי (עוֹבֵד), ה- JVM מדפיס את אינדקס המשתנים שהוקצה על ידי המהדר.

4. מסקנה

במדריך מהיר זה למדנו על מועיל NullPointerExceptions ב- Java 14. כפי שמוצג לעיל, הודעות משופרות עוזרות לנו לבצע איתור באגים בקוד מהר יותר בגלל פרטי קוד המקור המופיעים בהודעות החריגות.

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