JavaRush /בלוג Java /Random-HE /טריקים וטיפים. כיצד להימנע מ- NullPointerException ביישומ...
DarthVictor
רָמָה

טריקים וטיפים. כיצד להימנע מ- NullPointerException ביישומי Java

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

קרא לשיטות equals() ו-equalsIgnoreCase() במחרוזת ידועה ליטרלית ולא באובייקט לא ידוע

קרא תמיד למתודה equals()על מחרוזת ידועה שאתה יודע שאינה null. השיטה equals()היא סימטרית, כלומר קוראת a.equals(b)ותיתן b.equals(a)את אותה תוצאה (אם ולא a) , ומסיבה זו מתכנתים רבים לא שמים לב לאילו אובייקטים קוראים , y או y . אחת מתופעות הלוואי של זה היא NullPointerException אם השיטה נקראת על . bnullequals()abnull
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()מחזירה . זה נכון במיוחד עבור שיעורי עטיפה כגון , , או . nullnullIntegerFloatDoubleBigDecimal
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. מְקוֹרִי
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION