java.lang.NullPointerException הוא אחד החריגים הפופולריים ביותר בתכנות בשפת java. כל מי שעובד ב-java כנראה פגש בזה שצצה משום מקום בתוכנית java עצמאית כמו גם באפליקציית אינטרנט של java.
java.lang.NullPointerException
NullPointerException הוא חריג בזמן ריצה, לכן אין צורך לתפוס אותו בתוכנית. NullPointerException מעורר באפליקציה כאשר אנו מנסים לבצע פעולה מסוימת על null שבו נדרש אובייקט. כמה מהסיבות הנפוצות ל-NullPointerException בתכניות java הן:
- קריאה לשיטה על מופע של אובייקט אך בזמן ריצה האובייקט הוא null.
- גישה למשתנים של מופע של אובייקט שהוא null בזמן ריצה.
- מטיל null בתוכנית
- גישה לאינדקס או שינוי של ערך של אינדקס של מערך שהוא null
- בדיקת אורך של מערך שהוא null בזמן ריצה.
דוגמאות ל-NullPointerException ב-Java
נבדק כמה דוגמאות של NullPointerException בתוכניות Java.
1. NullPointerException בזמן קריאה לשיטת מופע
כאשר אנו מריצים את התוכנית לעיל, היא מפילה את הודעת השגיאה הבאה של NullPointerException.
אנו מקבלים NullPointerException בהצהרת t.foo("Hi");
משום ש-"t" הוא null כאן.
2. NullPointerException ב-Java בעת גישה/שינוי שדה של אובייקט שהוא null
התוכנית לעיל משפילה את מערך העקומה (stack trace) של NullPointerException הבא.
NullPointerException מושלכת בהצהרת int i = t.x;
משום ש-"t" הוא null כאן.
3. NullPointerException ב-Java כאשר null מועבר כארגומנט לשיטה
זהו אחד המקרים הנפוצים ביותר של java.lang.NullPointerException
מכיוון שזה הקורא שמעביר את הארגומנט הנאל.
התמונה למטה מציגה את חריגת הנקודת האפס הנאל כאשר התוכנית לעיל מופעלת ב- Eclipse IDE.
4. java.lang.NullPointerException כאשר מסור Null
למטה נמצא דיווח על מצור החריגה של התוכנית לעיל, המציין NullPointerException בשל צו השליפה של throw null;
.
5. NullPointerException כאשר מנסים לקבל את האורך של מערך נאל
6. NullPointerException כאשר ניתן לגישה לערך האינדקס של מערך נאל
7. NullPointerException בזמן שסונכרן על אובייקט שהוא null
הקוד synchronized(mutex)
יזרוק NullPointerException מכיוון שהאובייקט "mutex" הוא null.
8. HTTP Status 500 java.lang.NullPointerException
לפעמים אנו מקבלים תגובת דף שגיאה מיישום אינטרנט ב-Java עם הודעת שגיאה "HTTP Status 500 – Internal Server Error" ושורש הבעיה הוא java.lang.NullPointerException
.
בשביל זה, ערכתי את הפרויקט Spring MVC Example ושיניתי את שיטת ה-HomeController כך:
התמונה למטה מראה את הודעת השגיאה שנזרקה על ידי תגובת היישום אינטרנט.
כאן ההדפסת תיק חריגה:
השורש לבעיה הוא NullPointerException בהצהרת המשתמש user.getUserId().toLowerCase()
מכיוון ש-user.getUserId()
מחזיר null.
איך לזהות java.lang.NullPointerException
זיהוי NullPointerException הוא קל מאוד, פשוט מביטים בעקבות החריגה והיא תציג את שם המחלקה ומספר השורה של החריגה. לאחר מכן צפו בקוד וראו מה עשוי להיות ריק שגורם ל-NullPointerException. פשוט הסתכלו על כל הדוגמאות לעיל, זה ברור מעקב הערימה מה מגריל חריגת מצב ריקה.
איך לתקן את NullPointerException
java.lang.NullPointerException הוא חריג בלתי מבודד, לכן אין צורך לתפוס אותו. חריגות נקודה הריקה ניתן למנוע באמצעות בדיקות נקודה ריקה וטכניקות קידוד מונעות. ראו בדוגמאות הקוד למטה איך למנוע את java.lang.NullPointerException.
שיטות הקידוד הטובות ביותר למניעת NullPointerException
1. נחשוב על הפונקציה למטה ונחפש תרחיש הגורם לחריגה במצב של הפניה לא-קיימת (
NullPointerException יכולה להתרחש אם הארגומנט נמסר כ-
null. ניתן לכתוב את אותה השיטה כך שלא תתרחש החריגה באמצעות:
IllegalArgumentException ניתן גם להוסיף בדיקה של אי-קיום עבור הארגומנט ולזרוק אם נדרש.
2. ניתן להשתמש באופרטור טרנרי כפי שמוצג בקוד הדוגמא למטה.
3. השתמש ב למעשה, ניתן להוסיף בדיקה של אי-קיום עבור הארגומנט ולזרוק
IllegalArgumentException ניתן גם להוסיף בדיקת
6. ישנם שיטות מוגדרות במחלקות אוסף למניעת
NullPointerException, עליך להשתמש בהן, לדוג, contains(), containsKey(), ו־containsValue().
הפנייה: מסמך ה-API
Source:
https://www.digitalocean.com/community/tutorials/java-lang-nullpointerexception