שיעורי מודול (2/2)
נסה-עם-משאבים
בגירסאות ישנות יותר של Java, ניהול משאבים הדורשים סגירה מפורשת (כגון קבצים, חיבורי מסד נתונים או זרמי רשת) דרש חסימת finally חובה כדי להבטיח שהם נסגרו. זה הוביל לקוד מילולי ונוטה לדליפה.
Java 7 הציגה את הצהרת try-with-resources, המבטיחה סגירה אוטומטית של כל המשאבים המוצהרים בתוך הבלוק try, בתנאי שהם מיישמים את ממשק AutoCloseable.
התחביר
משאבים מוצהרים ומאוחלים בתוך סוגריים מיד לאחר מילת המפתח try.
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println("I/O Error: " + e.getMessage());
}
// br is closed automatically here, even if an exception occursהכרזה על משאבים מרובים
אתה יכול ליצור משאבים מרובים בתוך אותו בלוק try, להפריד ביניהם עם נקודה-פסיק ;. המשאבים ייסגרו בסדר הפוך מהכרזתם.
try (
FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")
) {
// Use resources
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}יצירת משאבים מותאמים אישית
ניתן להשתמש במשאב מותאם אישית בבלוק try-with-resources כל עוד הוא מיישם java.lang.AutoCloseable ועובר על שיטת close().
public class DatabaseConnection implements AutoCloseable {
public void query(String sql) {
System.out.println("Running query: " + sql);
}
@Override
public void close() {
System.out.println("Connection closed!");
}
}נסה זאת בעצמך
השלם את שיטת readFile באמצעות הצהרת try-with-resources כדי לאתחל BufferedReader עוטף FileReader בנתיב. בבלוק ה-catch, ייירט את IOException והדפיס 'שגיאה בקריאת קובץ'.
הצג רמז
הכריז על 'BufferedReader' בסוגריים מיד אחרי 'try', והטמיע טיפול 'IOException'.
הפתרון זמין לאחר 3 ניסיונות
הצג את המשאב המותאם אישית CustomResource בתוך בלוק try-with-resources, הפעל עליו את שיטת doWork() וטפל ב-Exception על ידי הדפסת 'Error'.
הצג רמז
השתמש ב- `try (CustomResource res = new CustomResource())` וקרא בתוכו `res.doWork();`.
הפתרון זמין לאחר 3 ניסיונות
הכריז גם על FirstResource וגם על SecondResource באותו מבנה של נסה עם משאבים. טפל בחריגה על ידי הדפסת 'שגיאה'.
הצג רמז
הפרד את ההצהרה של שני המשאבים בתוך הסוגריים של `try` באמצעות נקודה-פסיק `;`.
הפתרון זמין לאחר 3 ניסיונות