NullPointerException ב-Java הוא RuntimeException. זה מתרחש כאשר תוכנית מנסה להשתמש בהפניה לאובייקט בעל הערך null. ב-Java 'null' הוא ערך מיוחד שניתן להקצות להפניות לאובייקט כדי לציין היעדר ערך.
סיבות לחריג מצביע Null
NullPointerException מתרחשת מהסיבות הבאות:
- הפעלת שיטה מאובייקט null.
- גישה או שינוי בשדה של אובייקט null.
- לוקח את האורך של null כאילו זה מערך.
- גישה או שינוי של חריצים של אובייקטים null כאילו הם מערך.
- זריקת null כאילו היה ערך בר-זריקה.
- כאשר אתה מנסה לסנכרן על אובייקט null.
דוּגמָה:
היא מערכת יחסיםJava
public class Geeks { public static void main(String[] args) { // Reference set to null String s = null; System.out.println(s.length()); } }
תְפוּקָה:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)
הֶסבֵּר: בדוגמה זו ההפניה למחרוזת 's' היא null. כאשר התוכנית מנסה לקרוא למתודה length() היא זורקת NullPointerException כי אין אובייקט ממשי.
מספר שלם ל-Java כפול
מדוע נעשה שימוש ב-null ב-Java?
הערך null משמש כמציין מיקום והוא מציין שלא מוקצה ערך למשתנה התייחסות. יישומים נפוצים כוללים:
- מבני נתונים מקושרים : זה מייצג את סוף רשימה או ענף עץ.
- דפוסי עיצוב : זה משמש בתבניות כמו תבנית אובייקט Null או תבנית Singleton.
כיצד להימנע מ- NullPointerException
כדי להימנע מה-NullPointerException עלינו לוודא שכל האובייקטים מאותחלים כראוי לפני שנשתמש בהם. כאשר אנו מכריזים על משתנה התייחסות עלינו לוודא שהאובייקט אינו null לפני שאנו מבקשים שיטה או שדה מהאובייקטים.
1. שימוש ב-string letterals ב-equals()
בעיית מקרה נפוצה מאוד כרוכה בהשוואה בין משתנה מחרוזת למילולי. המילולי עשוי להיות מחרוזת או אלמנט של Enum. במקום להפעיל את השיטה מהאובייקט null שקול להפעיל אותה מהמילה המילולי.
דוּגמָה:
Javaimport java.io.*; class Geeks { public static void main (String[] args) { // Initializing String variable with null value String s = null; // Checking if s.equals null try { // This line of code throws NullPointerException because s is null if (s.equals('gfg')) System.out.print('Same'); else System.out.print('Not Same'); } catch(NullPointerException e) { System.out.print('NullPointerException Caught'); } } }
תְפוּקָה
NullPointerException Caught
אנו יכולים להימנע מ- NullPointerException על ידי קריאה ל-equivalent על מילולית ולא על אובייקט.
Javaimport java.io.*; class Geeks { public static void main (String[] args) { // Initializing String variable with null value String s = null; // Checking if s is null using try catch try { if ('gfg'.equals(s)) System.out.print('Same'); else System.out.print('Not Same'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
תְפוּקָה
Not Same
פֶּתֶק : הפעל תמיד שווים על המילולי כדי להימנע מקריאת מתודה בהפניה אפסית.
2. בדיקת טיעוני שיטה
לפני ביצוע הגוף של השיטה החדשה, עלינו לבדוק תחילה את הארגומנטים שלה עבור ערכי null ולהמשיך בביצוע השיטה רק כאשר הארגומנטים נבדקים כראוי. אחרת הוא יזרוק IllegalArgumentException ויודיע לשיטת הקריאה שמשהו לא בסדר עם הארגומנטים שעברו.
hashtable לעומת hashmap
דוּגמָה:
Javaimport java.io.*; class Geeks { public static void main(String[] args) { // String s set an empty string and calling getLength() String s = ''; try { System.out.println(getLength(s)); } catch (IllegalArgumentException e) { System.out.println( 'IllegalArgumentException caught'); } // String s set to a value and calling getLength() s = 'GeeksforGeeks'; try { System.out.println(getLength(s)); } catch (IllegalArgumentException e) { System.out.println( 'IllegalArgumentException caught'); } // Setting s as null and calling getLength() s = null; try { System.out.println(getLength(s)); } catch (IllegalArgumentException e) { System.out.println( 'IllegalArgumentException caught'); } } public static int getLength(String s) { if (s == null) throw new IllegalArgumentException( 'The argument cannot be null'); return s.length(); } }
תְפוּקָה
0 13 IllegalArgumentException caught
3. השתמש ב-Ternary Operator
ניתן להשתמש באופרטור הטרינרי כדי להימנע מ- NullPointerException. תחילה מוערך הביטוי הבוליאני. אם הביטוי נכון אז הערך 1 מוחזר אחרת הערך 2 מוחזר. אנו יכולים להשתמש באופרטור הטרינרי לטיפול במצביעי null.
דוּגמָה:
אלגוריתם עבור rsaJava
import java.io.*; class Geeks { public static void main(String[] args) { String s = null; String m = (s == null) ? '' : s.substring(0 5); System.out.println(m); s = 'Geeksforgeeks'; m = (s == null) ? '' : s.substring(0 5); System.out.println(m); } }
תְפוּקָה
Geeks
הֶסבֵּר : האופרטור השלישוני עוזר לבדוק אם יש null ולהימנע מפעולות על הפניות null.
4. שימוש בכיתה אופציונלית (Java 8+)
ב-Java 8 מחלקה אופציונלית הוצגה כאובייקט מיכל שעשוי להכיל או לא להכיל ערך שאינו ריק. זה עוזר להימנע NullPointerException על ידי אילוץ לטפל במפורש במקרה כאשר ערך נעדר.
דוּגמָה:
Javaimport java.util.Optional; public class OptionalExample { public static void main(String[] args) { Optional<String> name = Optional.ofNullable(null); // Safe way to access System.out.println(name.orElse('Default Name')); // prints: Default Name } }
תְפוּקָה
Default Name
הֶסבֵּר: Optional.ofNullable(value) עוטף את הערך שעשוי להיות null. orElse() מספק סתירה אם הערך אינו קיים.