היום אני אראה לך טכניקות פשוטות כיצד להימנע מ- NullPointerException ביישומים שלך. קל לעקוב אחריהם, אך משפרים משמעותית את המהימנות והאיכות של הקוד שלך. יתרה מכך, מניסיוני, לטיפ הראשון תהיה השפעה ניכרת על איכות הקוד שלך. אם אתם מכירים טריקים אחרים לתכנות ג'אווה, אתם מוזמנים לשתף אותם בתגובות.
השתמש
ישנן ספריות קוד פתוח רבות שלוקחות על עצמן את הנטל הכבד של בדיקות עבור השתדלו לא לחזור
זהו עוד טיפ טוב לתכנות ג'אווה שיהושע בלוך מתאר בספרו Java: Effective Programming. בעת החזרת אוספים ריקים או מערכים, ודא שקריאה לשיטות בסיס כמו
קרא לשיטות equals() ו-equalsIgnoreCase() במחרוזת ידועה ליטרלית ולא באובייקט לא ידוע
קרא תמיד למתודהequals()
על מחרוזת ידועה שאתה יודע שאינה null
. השיטה equals()
היא סימטרית, כלומר קוראת a.equals(b)
ותיתן b.equals(a)
את אותה תוצאה (אם ולא a
) , ומסיבה זו מתכנתים רבים לא שמים לב לאילו אובייקטים קוראים , y או y . אחת מתופעות הלוואי של זה היא NullPointerException אם השיטה נקראת על . b
null
equals()
a
b
null
Object unknownObject = null;
//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is null");
}
//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
System.err.println("better coding avoided NullPointerException");
}
זה היה הטיפ הפשוט ביותר להימנעות מ- NullPointerException, אבל הוא לבדו עושה שיפור עצום מכיוון שהשיטה equals()
נמצאת בכל מקום.
בחר valueOf() על פני toString() במקרים שבהם שניהם מייצרים את אותה תוצאה
מכיוון שהקריאהtoString()
להפניה עם ערך null
זורקת NullPointerException, עדיף להשתמש בקריאה valueOf()
כאשר אנו יכולים לקבל את אותה תוצאה, מכיוון שהקריאה valueOf()
מחזירה . זה נכון במיוחד עבור שיעורי עטיפה כגון , , או . null
null
Integer
Float
Double
BigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
השתמש בעצות אלה כאשר אינך בטוח אם אובייקט יכול להתקיים null
או לא.
השתמש null
בשיטות ובספריות בטוחות
ישנן ספריות קוד פתוח רבות שלוקחות על עצמן את הנטל הכבד של בדיקות עבור null
. אחד הנפוצים ביותר הוא StringUtils
מ- Apache Commons. שימוש בשיטות כגון StringUtils.isBlank()
, isNumeric()
, isWhiteSpace()
וכו'. אתה לא צריך לדאוג לזרוק NullPointerException.
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
פלט: true true false false ובכל זאת, לפני השימוש, אל תשכח לקרוא את התיעוד null
של שיטות ומחלקות בטוחות. זהו עוד אחד מהטריקים הטובים ביותר בג'אווה שמובילים לשיפורים עצומים מבלי לדרוש מאמץ רב.
השתדלו לא לחזור null
משיטה, עדיף להחזיר אוסף ריק
זהו עוד טיפ טוב לתכנות ג'אווה שיהושע בלוך מתאר בספרו Java: Effective Programming. בעת החזרת אוספים ריקים או מערכים, ודא שקריאה לשיטות בסיס כמו size()
או length()
לא זורקת NullPointerException. המחלקה Collections
מצהירה ספציפית על יישומים נוחים של רשימות ריקות, ערכות ומילונים: Collections.EMPTY_LIST
, Collections.EMPTY_SET
ו Collections.EMPTY_MAP
. לדוגמה:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
באופן דומה, אתה יכול להשתמש Collections.EMPTY_SET
בו Collections.EMPTY_MAP
במקום להחזיר null
.
השתמש בהערות @NotNull ו-@Nullable
בתיאור השיטות שלך, אתה יכול להגדירnull
מוסכמות בטיחות של שיטה באמצעות הערות @NotNull
ו-@Nullable כדי לציין אם שיטה יכולה לחזור null
או לא. מהדרים ו-IDEs מודרניים יכולים להשתמש בהערות אלה כדי לנתח את הקוד שלך ולתת עצות מתאימות, למשל, לגבי החמצת צ'ק עבור null
, או להיפך, לגבי האפשרות להסיר סימון מיותר שסותם את הקוד. הערות כאלה, למשל, נתמכות על ידי ה-IntelliJ IDE ו-FindBugs, והם כלולים גם ב-JSR 305. אבל גם אם ה-IDE שלך לא תומך בהערות כאלה, הם יהיו תיעוד טוב בפני עצמם. מסתכלים @NotNull
ויהיה @Nullable
קל יותר למתכנת להבין היכן להוסיף צ'ק null
ואיפה לא. זה, אגב, נוהג חדש למדי בקרב מתכנתי ג'אווה, וייקח זמן עד שהוא יתפשט.
הימנע מ-autoboxing ו-autounboxing מיותרים בקוד שלך
לא רק שזה מוביל ליצירת אובייקטים זמניים מיותרים, אלא ש-autoboxing יכול גם לזרוק NullPointerException אם מחלקת ה-wrapper היאnull
. לדוגמה, הקוד הבא יזרוק NullPointerException אם ערך האדם אינו מכיל מספר טלפון ומחזיר null
.
Person ram = new Person("ram");
int phone = ram.getPhone();
בעת שימוש ב-autoboxing או autounboxing, לא רק שוויון, אלא גם אי-שוויון <
> >
יכולים לגרום ל-NullPointerException.
פעל בהתאם למוסכמות והגדר ברירות מחדל סבירות.
אחת הדרכים הטובות ביותר להימנע מ-NullPointerException ב-Java היא להצהיר כראוי ולעקוב אחר מוסכמות קידוד. רוב NullPointerExceptions מתרחשים כאשר אתה מנסה ליצור אובייקט מבלי לקבל את כל הנתונים והתלות שהוא דורש. על ידי מניעת יצירת אובייקטים לא גמורים על ידי דחיית בקשות כאלה בחן, תחסוך מעצמך מספר רב של NullPointerExceptions בעתיד. באופן דומה, אם אתה מאפשר יצירת אובייקט, עליך לבחור בערך ברירת מחדל סביר. לדוגמה, לא ניתן ליצור אובייקט מחלקהEmployee
ללא שם ו- id
, אך ייתכן שאין לו מספר טלפון. במקרה זה, אובייקטים Employee
ללא מספר עשויים להחזיר אפס במקום זאת null
. למרות שיש לחשוב על התנהגות כזו של האובייקט מראש - אולי קל יותר לבדוק מאשר null
להתקשר למספר שאינו קיים. במקרה זה, קיום תנאים נוספים על אילו שדות נמצאים null
ועל אילו לא יסייעו בקבלת ההחלטה הנכונה. באופן כללי, הבחירה בין קריסה מיידית של התוכנית או הקצאה null
היא החלטה עיצובית חשובה, ולאחר שבחרת, עליך לבצע אותה בעקביות.
הגדר הגבלות ברמת DBMS
כאשר אתה משתמש במסד נתונים לאחסון אובייקטי התוכנית שלך, כגון לקוחות או הזמנות, חכם לציין אתnull
ה"נ" של האובייקטים שלך ברמת DBMS, תוך שימוש בהגבלות טבלה מתאימות. מאגרי מידע מכילים לעתים קרובות מידע ממקורות מרובים, והכנסת בדיקות לאיתור ערכים חסרים תשפר את שלמות הנתונים שלך. בנוסף, נוכחות של בדיקות ל-null ברמת DBMS תפחית אותם בקוד ה-Java שלך: על ידי טעינת נתונים ממסד הנתונים לתוך אובייקטי Java, אתה יכול להיות בטוח בנוכחותם ולהסיר " " מיותר != null
מקוד התוכנית.
השתמש ב-Null Object Pattern
יצירתNull
אובייקטים מיוחדים היא דרך נוספת להימנע מ- NullPointerExcpetion ב-Java. נניח ששיטה כלשהי באפליקציה שלנו מחזירה אובייקט שהתוכנית עובדת איתו לאחר מכן על ידי קריאה לשיטות שלה. לדוגמה, השיטה Collection.iterator()
מחזירה אובייקט מהמחלקה Iterator
המשמשת לחזרה על האוסף. לאחר מכן אם לאובייקט המקורי אין איטרטור כלשהו, null
אתה יכול במקום זאת להחזיר אובייקט מיוחד Null
שיש לו שיטה hasNext()
שתמיד מחזירה false
. זה הכל, קורא יקר, כאן אני מסיים את הטיפים שלי להפטר מתוכניות Java משגיאות NullPointerException. אתה תעריך כמה חוקים פשוטים ולא מכבידים יכולים להיות שימושיים. כזכור, אם ברצונך לשתף טריקים אחרים של NullPointerException בתוכניות Java, אל תהסס לעשות זאת בהערות. תורגם במיוחד עבור תלמידי JavaRush. מְקוֹרִי
GO TO FULL VERSION