FileNotFoundException בג'אווה

1. הקדמה

במאמר זה נדבר על חריג נפוץ מאוד בג'אווה - ה- FileNotFoundException.

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

2. מתי יוצא החריג?

כפי שצוין בתיעוד ה- API של Java, ניתן להשליך חריג זה כאשר:

  • קובץ עם שם הנתיב שצוין עושהלֹא קיימים
  • קובץ עם שם הנתיב שצוין עושה קיימים אבלאינו נגיש משום מה (כתיבה מתבקשת לקובץ לקריאה בלבד, או הרשאות אינן מאפשרות גישה לקובץ)

3. כיצד לטפל בזה?

קודם כל, תוך התחשבות שהוא מתרחב java.io.IO חריג שמתארך java.lang. חריג, תצטרך להתמודד עם זה עם נסה לתפוס חסום כמו עם כל E מסומן אחרתפיסה.

ואז, מה לעשות (עסק / לוגיקה קשור) בתוך נסה לתפוס חסימה תלויה למעשה במה שאתה צריך לעשות.

ייתכן שיהיה עליך:

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

4. דוגמאות

כעת נראה דוגמאות שכולן יתבססו על מחלקת הבדיקה הבאה:

מחלקה ציבורית FileNotFoundExceptionTest {לוגרית סופית סטטית פרטית LOG = Logger.getLogger (FileNotFoundExceptionTest.class); פרטי מחרוזת fileName = Double.toString (Math.random ()); ריק מוגן readFailingFile () זורק IOException {BufferedReader rd = חדש BufferedReader (FileReader חדש (קובץ חדש (fileName))); rd.readLine (); // אין צורך לסגור את הקובץ} Class BusinessException מרחיב את RuntimeException {public BusinessException (מחרוזת מחרוזת, FileNotFoundException ex) {super (string, ex); }}}

4.1. רישום החריג

אם אתה מריץ את הקוד הבא, הוא "יתעד" את השגיאה במסוף:

@Test הריק ציבורי logError () זורק IOException {נסה {readFailingFile (); } לתפוס (FileNotFoundException ex) {LOG.error ("קובץ אופציונלי" + fileName + "לא נמצא.", למשל); }}

4.2. העלאת חריג ספציפי לעסקים

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

@Test (צפוי = BusinessException.class) public void raiseBusinessSpecificException () זורק IOException {נסה {readFailingFile (); } לתפוס (FileNotFoundException ex) {לזרוק BusinessException חדש ("BusinessException: הקובץ הדרוש לא היה קיים.", לשעבר); }}

4.3. יצירת קובץ

לבסוף, ננסה ליצור את הקובץ כך שניתן יהיה לקרוא אותו (אולי לשרשור שקורא ברציפות קובץ), אך שוב לתפוס את החריג ולטפל בשגיאה השנייה האפשרית:

@Test ציבורי בטל createFile () זורק IOException {נסה {readFailingFile (); } לתפוס (FileNotFoundException לשעבר) {נסה {קובץ חדש (fileName) .createNewFile (); readFailingFile (); } לתפוס (IOException ioe) {לזרוק RuntimeException חדש ("BusinessException: אפילו לא ניתן ליצור.", ioe); }}}

5. מסקנה

ברישום מהיר זה ראינו מתי FileNotFoundException יכול להתרחש ומספר אפשרויות לטפל בזה.

כמו תמיד, הדוגמאות המלאות הסתיימו ב- Github.