الانتقال إلى المحتوى الرئيسي
الوحدة 5 · الدرس 2 من 210/14 في الدورة~12 min
دروس الوحدة (2/2)

حاول مع الموارد

في الإصدارات الأقدم من Java، كانت إدارة الموارد التي تتطلب إغلاقًا صريحًا (مثل الملفات أو اتصالات قاعدة البيانات أو تدفقات الشبكة) تتطلب حظرًا إلزاميًا finally لضمان إغلاقها. أدى هذا إلى كود مطول وعرضة للتسرب.

قدمت Java 7 عبارة try-with-resources، والتي تضمن الإغلاق التلقائي لجميع الموارد المعلنة داخل الكتلة try، بشرط أن تقوم بتنفيذ الواجهة AutoCloseable.

بناء الجملة

يتم الإعلان عن الموارد وتهيئتها بين قوسين مباشرة بعد الكلمة الأساسية try.

Java
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، مع الفصل بينها بفاصلة منقوطة ;. سيتم إغلاق الموارد بترتيب عكسي لإعلانها.

Java
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().

Java
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!");
    }
}

جربه بنفسك

تمرين#java.m5.l2.e1
المحاولات: 0جارٍ التحميل…

أكمل طريقة readFile باستخدام عبارة Try-with-resources لتهيئة BufferedReader الذي يقوم بتغليف FileReader على المسار. في كتلة الالتقاط، اعترض IOException واطبع "خطأ في قراءة الملف".

جارٍ تحميل المحرر…
إظهار التلميح

قم بتعريف "BufferedReader" بين قوسين مباشرة بعد "المحاولة"، وقم بتنفيذ معالجة "IOException".

الحل متاح بعد 3 من المحاولات

تمرين#java.m5.l2.e2
المحاولات: 0جارٍ التحميل…

قم بإنشاء مثيل للمورد المخصص CustomResource داخل كتلة Try-with-resources، واستدعاء طريقة doWork() عليه، والتعامل مع الاستثناء عن طريق طباعة "خطأ".

جارٍ تحميل المحرر…
إظهار التلميح

استخدم `جرّب (CustomResource res = new CustomResource())` واتصل بداخله بـ `res.doWork();`.

الحل متاح بعد 3 من المحاولات

تمرين#java.m5.l2.e3
المحاولات: 0جارٍ التحميل…

قم بتعريف كل من FirstResource وSecondResource في نفس بنية المحاولة باستخدام الموارد. التعامل مع الاستثناء عن طريق طباعة "خطأ".

جارٍ تحميل المحرر…
إظهار التلميح

افصل التصريح عن المصدرين داخل قوسي `حاول` باستخدام فاصلة منقوطة `;`.

الحل متاح بعد 3 من المحاولات