دروس الوحدة (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 على المسار. في كتلة الالتقاط، اعترض IOException واطبع "خطأ في قراءة الملف".
إظهار التلميح
قم بتعريف "BufferedReader" بين قوسين مباشرة بعد "المحاولة"، وقم بتنفيذ معالجة "IOException".
الحل متاح بعد 3 من المحاولات
قم بإنشاء مثيل للمورد المخصص CustomResource داخل كتلة Try-with-resources، واستدعاء طريقة doWork() عليه، والتعامل مع الاستثناء عن طريق طباعة "خطأ".
إظهار التلميح
استخدم `جرّب (CustomResource res = new CustomResource())` واتصل بداخله بـ `res.doWork();`.
الحل متاح بعد 3 من المحاولات
قم بتعريف كل من FirstResource وSecondResource في نفس بنية المحاولة باستخدام الموارد. التعامل مع الاستثناء عن طريق طباعة "خطأ".
إظهار التلميح
افصل التصريح عن المصدرين داخل قوسي `حاول` باستخدام فاصلة منقوطة `;`.
الحل متاح بعد 3 من المحاولات