محتويات الدورة

Java / المتوسط / الدرس 9

الاستثناءات وملكية الموارد والغياب

صمّم مسارات فشل تحفظ المعنى والتنظيف وميّز الفشل المتحقق وعيوب البرمجة والنتيجة الغائبة وعمر الموارد.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • التقاط الفشل عند وجود سياسة مفيدة.
  • استخدام try-with-resources وحفظ السبب.
  • تمثيل النتيجة الاختيارية دون إخفاء الخطأ.

افصل الإدخال غير الصالح من الفشل التشغيلي

يقطع الاستثناء التدفق الطبيعي ويحمل نوعاً ورسالة ومكدساً وسبباً محتملاً. تتطلب الاستثناءات المتحققة معالجة أو إعلاناً وتشمل غير المتحققة مخالفات عقود وعيوباً كثيرة. لا يعني الفرق أن الأول قابل للتعافي دائماً أو أن الثاني مهمل. اختر السياسة وفق العملية والحد لا اسم الفرع وحده.

تستحق كمية تالفة وملف غير متاح وثابت داخلي مكسور استجابات مختلفة. ارفض بيانات المستخدم بوضوح وترجم الفشل المتوقع عند حد مناسب وأبق العيب غير المتوقع مرئياً. يخفي التقاط Exception وإعادة قيمة طبيعية الفرق وقد يجعل العمل اللاحق يتصرف على نجاح مختلق.

التقط بدقة واحفظ معنى التشخيص

يلتقط مثال التحليل NumberFormatException فقط ويعرض رفضاً صريحاً؛ ولا يحول 'twelve' إلى صفر. المدخل مصطنع والخرج آمن للعرض. ينبغي للتطبيق تجنب تسجيل مدخل حساس مع الاحتفاظ بمعرف عملية وسياق تشخيص مقيد كافٍ.

يجب أن يتعافى catch أو يترجم مع حفظ السبب أو يعيد الفشل؛ ولا تكفي غالباً طباعة المكدس والمتابعة. احفظ الاستثناء الأصلي كسبب عند التغليف لا رسالته فقط. لا تكشف مسارات أو أسراراً أو مكدساً للمستخدم حين تكفي استجابة عامة ثابتة.

java سياسة فشل تحليل محددة
public class Main {

 public static void main(String[] args) throws Exception {
try {
 int quantity=Integer.parseInt("twelve");
 System.out.println(quantity);
} catch(NumberFormatException ex) {
 System.out.println("invalid quantity");
}
 }
}
الناتج المتوقع
invalid quantity

يفشل التحليل قبل استخدام quantity ولا يطبع إلا فرع الرفض.

امنح التنظيف مالكاً

تحتاج موارد كالقارئ والدفق والاتصال إلى إغلاق سريع مستقلاً عن جمع القمامة. تغلق try-with-resources موارد AutoCloseable عند الخروج بما في ذلك الفشل وبعكس ترتيب الإعلان. اجعل العمر أضيق ما يضم العمل ولا تغلق مورداً مشتركاً لا تملكه لمجرد أنه يدعم close.

يستخدم المثال StringReader فلا يمس ملفات حقيقية. يقرأ سطراً ويغلق BufferedReader عند الخروج. إذا فشل الجسم والإغلاق يحفظ البناء الخطأ الأساسي ويضيف فشل التنظيف كمكبوت. قد يخفي finally يدوي يطلق خطأ جديداً الأصل، لذا افحص المكبوت عند التشخيص.

java تنظيف قارئ مملوك في الذاكرة
public class Main {

 public static void main(String[] args) throws Exception {
try(var reader=new java.io.BufferedReader(new java.io.StringReader("alpha\nbeta"))) {
 System.out.println(reader.readLine());
}
 }
}
الناتج المتوقع
alpha

السطر الأول alpha ويغلق القارئ عند نهاية الكتلة دون انتظار جامع القمامة.

استخدم الغياب نتيجة لا خطأ مقنعاً

تمثل Optional<T> نتيجة قد تغيب بصورة مشروعة، وليست بديلاً عاماً لكل حقل قابل لـnull أو كل فشل. قد تعيد عملية بحث بلا مطابقة Optional.empty، بينما يبقى فشل المصدر فشلاً ما لم يساوه العقد بالغياب صراحة. لا تستدع get دون إثبات الوجود.

تحول map وflatMap القيمة الموجودة وتقيّم orElseGet البديل كسولاً. قد يؤدي معامل بديل حثيث عملاً غير لازم رغم وجود القيمة. لا تعد null مكان Optional ولا تعشّق الحاويات بلا حاجة. حدد هل الفراغ يعني غير موجود أو غير منطبق أو حالة دقيقة أخرى.

اختبر الفشل والتنظيف كسلوك أساسي

يحقن الاختبار المفيد فشلاً بعد اكتساب المورد ويتحقق من التنظيف لا الإرجاع العادي فقط. اختبر حدود التحليل والغياب وفشل الإغلاق عند اللزوم وحفظ السبب أثناء الترجمة. أظهر الملكية في الواجهة والبنية لا تعليق يأمل أن تغلق طبقة أخرى لاحقاً.

لا تستخدم الاستثناء لنهاية حلقة عادية مع وجود نهاية إدخال. وبالمقابل لا تحول فشل عملية استثنائية إلى مجموعة فارغة لتبسيط المستدعي. يميز الحد الصحيح الغياب والرفض والفشل التشغيلي والعيب كي يقرر التطبيق بصورة صحيحة.

الأخطاء الشائعة وإصلاحها

NoSuchElementException from Optional.get

لماذا يحدث؟
افترضت الشيفرة وجود قيمة اختيارية.
كيف تصلحه؟
استخدم فرع غياب محدداً أو عمليات Optional.
كيف تتجنب تكراره؟
اختبر الغائب والموجود.

A file or reader remains open after failure

لماذا يحدث؟
وُضع التنظيف في النجاح فقط.
كيف تصلحه؟
استخدم try-with-resources للموارد المملوكة.
كيف تتجنب تكراره؟
احقن فشلاً بعد الاكتساب.

The original exception disappeared

لماذا يحدث؟
أُهمل السبب أو استبدله التنظيف.
كيف تصلحه؟
احفظ السبب وافحص المكبوت.
كيف تتجنب تكراره؟
راجع مسارات الفشل وترجمته العامة.

اختبر فهمك

1. مصدر البحث غير متاح. هل يعيد Optional.empty؟

اعرض الحل المشروح

فقط إن ساوى العقد الانقطاع بغياب النتيجة عمداً وهو مضلل عادة. احفظ الفشل ليتسنى الإعادة أو الإبلاغ، واجعل الفراغ لبحث ناجح بلا مطابقة.

2. يفشل الجسم والإغلاق معاً. ما الدليل المحفوظ؟

اعرض الحل المشروح

يبقى خطأ الجسم أساسياً ويكبت خطأ التنظيف؛ تنفذ try-with-resources ذلك. افحص getSuppressed واحتفظ بالسلسلة في سجل مقيد لا عرض عام.

أهم ما تعلمته

  • تنتمي سياسة الفشل إلى حد ذي معنى.
  • الإغلاق السريع مستقل من جمع القمامة.
  • الغياب وفشل الجلب نتيجتان مختلفتان.

المراجع الرسمية