פרסומת
חריג בתכנות מסמל מצב חריג בשלב מסוים בביצוע התוכנית. הוא משמש כאשר ניתן לטפל במצב החריג בצורה טובה יותר במקום אחר במקום בו הוא נתקל. שקול את הדוגמאות הבאות:
- כשל בפתיחת קובץ תצורה ניתן לטפל טוב יותר בקוד, אולי באמצעות מיקום קובץ תצורה חלופי.
- גישה ל- פריט מערך כיצד להשתמש ב- Java ArrayListמערך ג'אווה הוא מערך שניתן לשנות את גודל המטרה הכללית. זה מספק את רוב המתקנים המצפים בדרך כלל מערכים בשפות אחרות. במאמר זה תלמד להגדיר arraylist ולהשתמש בו. קרא עוד מחוץ לתחום המערך מסמל באג תוכנית. באגים מאושרים!
- יש להביא שגיאת ניתוח XML לידיעת המשתמש כך שניתן לתקן את קובץ ה- XML.
- ניתן לתקן את התוכנית שאוזלה בזיכרון (אולי בעת עיבוד קובץ גדול) על ידי הגדלת כמות הזיכרון הזמינה לתהליך הג'אווה.
בכל המקרים הללו (ועוד) יש לטפל בחריגה מחוץ למיקום בו הוא נוצר, כך שניתן יהיה לטפל בסיבה הבסיסית.
סוגי חריגים
התמונה למטה מציגה את החלקים העיקריים בהיררכיית חריגות ג'אווה. מעמד הבסיס הוא ניתן לזרוק שמתחת לקטגוריה זו יוצא מן הכלל ו שגיאה. מעמד יוצא מן הכלל מיועד לתנאים הקשורים לתוכנית אותם יישומים יכולים לתפוס בניסיון להציל את המצב. מעמד
שגיאהלעומת זאת, מיועד לציין שגיאות חמורות בסביבת זמן ההפעלה של Java אשר היישומים לא צריכים לתפוס. חלק מהדוגמאות הן: OutOfMemoryError ו StackOverflowError.א יוצא מן הכלל שוב הוא משני סוגים: מסומן ולא מסומן. חריגה מסומנת חייבת להיות מטופלת על ידי קוד השיחה. כלל זה נאכף על ידי מהדר הג'אווה. לעומת זאת, ניתן להפיץ את שרשרת השיחות מבלי להצהיר על כך באופן מפורש. הדוגמאות להלן יבהירו.
חריגים מסומנים
השיטה הבאה מנסה ליצור FileReader מקובץ. הקבלן זורק חריג בדוק FileNotFoundException שיש לטפל באמצעות קוד השיחה או להכריז על השלכתם.
הקוד הבא יהיה לא להרכיב מכיוון שזה לא עושה את זה.
load voile קובץ פרטי (שם קובץ מחרוזת) {FileReader ב = חדש FileReader (שם קובץ); }
אחת הדרכים לגרום לקוד לערוך היא לטפל בחריג (ראה להלן).
load voile קובץ פרטי (שם קובץ מחרוזת) {נסה {FileReader ב = חדש FileReader (שם קובץ)); {} לתפוס (FileNotFoundException ex) {// לטפל בחריגה כאן} }
אם לא ניתן לטפל ישירות בחריג על ידי המתקשר, יש להכריז עליו בחתימת השיטה.
load voile פרטי (שם קובץ מחרוזת) זורק את java.io. FileNotFoundException. {FileReader ב = חדש FileReader (שם קובץ)); { }
חריגים שלא סומנו
חריג שאינו מסומן הוא זה שנמצא מתחת לקטגוריות משנה חריגת זמן ריצה ואין צורך לטפל בהם ישירות או להכריז כנ"ל. לדוגמה, הקוד הבא מוביל א NullPointerException, שהוא סוג של חריגת זמן ריצה. עם זאת, הקוד מורכב ללא שגיאה מאז NullPointerException הוא חריג שלא סומן.
private void handleEvent () {שם מחרוזת = null; if (name.length ()> 0) {} }
חריגות עוטפות
בהתחשב בדיון שלעיל בנושא חריגים מסומנים ולא מסומנים, נראה כי קל יותר להתמודד עם חריגים לא מסומנים מכיוון שלא תצטרך להכריז עליהם או לטפל בהם בעצמך. לנוכח הנוחות הזו, לפעמים יכול להיות מועיל לעטוף חריג מסומן בחריג שאינו מסומן.
דוגמת הקוד הבאה מראה כיצד לעטוף חריג. השיטה method_1 () זורק SQLException בגופו. בכדי לקוד לקבץ נכון, יש להכריז על החריג שיזרוק.
שיטת חלל פרטית_1 () זורקת את SQLException {... לזרוק SQLException חדש; }
כאשר שיטה זו מופעלת משיטה אחרת (שיטה_2 ()), שיטה זו יכולה לתפוס את SQLException ועטוף אותו בחריג שאינו מסומן, כך שהוא לא צריך להכריז על החריג בחתימת השיטה שלו.
שיטת פרטי חלל שיטה_2 () {נסה {שיטה_1 (); } לתפוס (java.sql. SQLException ex) {לזרוק RuntimeException חדש (ex); } }
חריג ערימת עקבות
Trace Stack Trace מתייחס למערך מסגרות הערימה הפעילות, שכל אחת מהן מייצגת הפניית שיטה, שנלכדה על ידי ה- JVM בזמן שנזרק החריג. כל מסגרת מחסנית כוללת את מיקום הפקודה של השיטה כולל שם הכיתה, שם השיטה, ואולי גם שם קובץ המקור של ג'אווה ומספר השורה בקובץ. זה שימושי להתחקות אחר רצף השיחות זה גרם לשגיאה חריגים מג'אווה: האם אתה מטפל בהם נכון?חריג בתכנות מסמל מצב חריג בביצוע התוכנית. הוא משמש כאשר ניתן לטפל במצב טוב יותר במקום אחר. שקול את הדוגמאות הבאות לטיפול בחריגות ב- Java. קרא עוד .
להלן עקמת ערימה טיפוסית, המתקבלת מאובייקט החריג כאשר הוא נתפס.
חריג בשרשרת "עיקרית" java.lang. IndexOutOfBounds תפיסה: אינדקס: 8, גודל: 5 ב- java.util. ArrayList.rangeCheck (ArrayList.java: 653) באתר java.util. ArrayList.get (ArrayList.java: 429) באתר sample.sample1.main (sample1.java: 24)
החריג שנתפס כאן הוא IndexOutOfBoundsException. זה כולל מידע נוסף על השגיאה. עקוב הערימה מכיל 3 מסגרות ערימה, שכל אחת מהן כוללת את פרטי המיקום כמוצג.
טיפול בחריגים
ניתן לטפל בחריג על ידי תפיסתו בתוך א נסה לתפוס לחסום ולנקוט כל פעולה מתקנת הנדרשת. ה יוצא מן הכלל האובייקט מספק מספר שיטות לחילוץ מידע על המצב שגרם לו.
הקוד הבא רושם את הודעת השגיאה לקובץ יומן.
private void loadConfig () {נסה {// להפעיל קוד שעשוי ליצור תפוס IOException} (java.io. Ex IOException) {// לטפל בחריגה כאן. יכול להיות יומן לקובץ יומן. log.warning (ex.getMessage ()); } }
כאשר חריגה עטופה בתוך אחר, אתה יכול לאחזר את החריג שעטוף:
סיבה לזריקה = ex.getCause (); log.warning ("סיבה תחתונה:" + סיבה.getMessage ());
האם אתה צריך לגשת למעקב הערימה, ואולי לחלץ את שם השיטה שגרמה לה?
StringBuilder sbuf = StringBuilder חדש ("Trace Trace:"); עבור (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). הוסף ("\ n"); } log.warning (sbuf.toString ());
או אולי, רישום את החריג וזרוק אותו מחדש?
נסה {... } לתפוס (java.io. IOException ex) {log.warning (ex.getMessage ()); לזרוק לשעבר; }
ה יוצא מן הכלל הכיתה מספקת printStackTrace () שיטה שיכולה להדפיס את עקמת הערימה משלך PrintStream (או PrintWriter).
נסה {... } לתפוס (java.io. Ex IOException) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (החוצה); }
אתה יכול לתפוס מספר סוגים של חריגים בסינגל נסה חסום וביצע טיפול ספציפי לכל סוג חריג.
נסה {// זורק כאן כמה חריגים. } לתפוס (java.io. Ex IOException) {// טיפול ספציפי ב- IOException כאן. } לתפוס (java.sql. SQLException ex) {// טיפול ספציפי ב- SQLException כאן. }
כדי לתפוס מספר חריגים מרובים אך להשתמש באותו קוד טיפול, אתה יכול להכריז על א לתפוס חסום במספר סוגים כדלקמן:
נסה {// זורק כאן כמה חריגים. } לתפוס (java.io. IOException | java.sql. SQLException ex) {// IOException וטיפול ספציפי SQLException כאן. } catch (SAXException ex) {// טיפול ספציפי SAXException כאן. }
לנקות משאבים בסופו של דבר
כאשר מתמודדים עם קוד שיכול לזרוק חריגים, חיוני לבצע ניקוי נכון של כל המשאבים, כגון קבצים שנפתחו כל מה שאתה צריך לדעת על פורמטים של קבצים ועל המאפיינים שלהםאנו משתמשים בקובץ המילים להחלפה: מוסיקה, תמונה, גיליון אלקטרוני, מצגת שקופיות וכן הלאה. אבל מה בכל זאת הופך קובץ ל"קובץ "? בואו ננסה להבין את החלק הבסיסי הזה במחשוב. קרא עוד , חיבורי מסד נתונים וכו '. ניקוי משאבים צריך להתבצע ב סוף כל סוף חסום. בדרך זו יציאה רגילה וגם יציאה חריגה מגוש קוראים את קוד ניקוי 10 הטעויות הגרועות ביותר בתכנות בהיסטוריהבעבר הקומה גם קידוד הרס מחושל. מקרים של מעט קוד גרוע גרמו לאסון ברמה עיקרית. להלן 10 טעויות תכנות גרועות בהיסטוריה. קרא עוד .
InputStream ב = null; נסה {... in = חדש FileInputStream (שם קובץ);... } לתפוס (java.io. IOException ex) {log.warning (ex.getMessage ()); } לבסוף {// קוד כאן מבוצע ביציאה ממחסום הניסיון, // אם בדרך כלל ובין אם בגלל חריג אם (in! = null) in.close (); }
נסה לחסום משאבים
Java 1.7 הציג את נסה עם משאבים מבנה שמקל על ניקוי המשאבים. זה נראה כמו זה:
נסה (InputStream ב = FileInputStream חדש (..)) {// קוד המשתמש ב- InputStream. }
כאשר הקוד יוצא מהבלוק (בין אם בניקיון ובין אם בשל חריג), InputStream המשתנה מנוקה אוטומטית.
ניקוי משאבים מרובים על ידי הצהרת כולם בראש החסימה.
נסה (InputStream ב = חדש FileInputStream (..); חיבור con =...; ) {// קוד המשתמש ב- InputStream ובחיבור. }
כל אובייקט שהכיתה שלו מיישמת את סגירה אוטומטית ממשק ניתן לנקות בצורה זו. המחלקה הבאה מבצעת ניקוי ספציפי ב סגור() שיטה.
MyClass בכיתה ציבורית מיישמת AutoCloseable {close off void close () {// קוד ניקוי כאן} }
השתמש במופע של כיתה זו בסעיף א נסה עם משאבים חסום.
נסה (MyClass obj = חדש MyClass (..)) {// קוד המשתמש באובייקט MyClass. }
כמה חריגים נפוצים בדרך כלל
הבה נסתכל כעת על כמה חריגים נפוצים.
- IndexOutOfBoundsException (לא מסומן): מציין שהאינדקס של האלמנט אליו ניגשים נמצא מחוץ לתחום מערך, מחרוזת וכו '.
- SQLException (מסומן): נזרק עקב שגיאת בסיס נתונים.
- IOException (מסומן): שגיאת גישה לקובץ או שגיאות הקשורות לקלט ולפלט.
- InterruptionException (מסומן): נזרק כאשר מופסק ביצוע של חוט.
- SAXException (מסומן): נזרק עקב שגיאות ניתוח XML.
- NullPointerException (לא מסומן): שימוש ב- null במקום בו חפץ נדרש.
מסיימים
חריגים הם השיטה העיקרית לדיווח וניהול שגיאות ב- Java. שימוש נכון בחריגים שפר את איכות הקוד כתוב או קוד מהר יותר בעורך הטקסט של Linux בעזרת ערכות נושא מותאמות אישיתעורך הטקסט של לינוקס שלך לא צריך להיראות ערמומי ו"פונקציונאלי ". מדוע לא לצבוט את זה כדי לשפר את הפרודוקטיביות שלך, בין אם סקריפט וקידוד או שימוש בכלי כעורך סימון? קרא עוד ועזרה בפתרון בעיות בייצור.
האם יש לך סיפורי מלחמה הקשורים לחריג? אם כן, ספר לנו על כך בסעיף התגובות למטה.
קרדיט תמונה: דמיטרי ניקולייב דרך Shutterstock.com