English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Exception (الاستثناء) هي مشكلة تحدث أثناء تنفيذ البرنامج (خطأ في التنفيذ). إليك بعض الأمثلة على الحلول-
إذا كان حجم مصفوفتك 10، إذا حاولت سطر من الكود الوصول إلى العنصر الـ 11 في المصفوفة.
إذا حاولت تقسيم رقم بصفة (النتيجة هي غير محددة، ولا يعرف JVM كيف يcalculate قيمته).
عندما يحدث استثناء، يتوقف البرنامج بشكل مفاجئ في السطر الذي أدى إلى الاستثناء، مما يجعل باقي البرنامج غير قادر على التنفيذ. لتجنب هذا، يجب معالجة الاستثناءات.
هناك نوعان من الاستثناءات في Java.
استثناءات التنفيذ - الاستثناءات غير المكتشفة هي الاستثناءات التي تحدث في وقت التنفيذ. هذه تُدعى أيضًا استثناءات التنفيذ. تشمل هذه الأخطاء البرمجية مثل الأخطاء اللفظية أو استخدام API بشكل غير صحيح. يتم تجاهل الاستثناءات التنفيذية عند التجميع.
استثناءات التجميع - الاستثناءات التي تُتحقق في وقت التجميع تُدعى استثناءات التجميع. هذه الاستثناءات لا يمكن تجاهلها بسهولة عند التجميع. يجب أن يهتم المبرمجون (بتعامل) مع هذه الاستثناءات.
لمعالجة الاستثناءات، يقدم Java ميكانيكية try-catch.
يتم وضع جسم try / catch حول الكود الذي يمكن أن يحدث به استثناء. يُدعى الكود في جسم try / catch بالكود المحمي.
try { // كود محمي } // block catch {}
عندما يحدث استثناء في جسم try، يقوم JVM بحفظ تفاصيل الاستثناء في است堆، ويستمر في معالجة جسم catch بدلاً من إنهاء البرنامج.
تتضمن جملة catch إعلان نوع الاستثناء الذي تريد التقاطعه. إذا حدث استثناء في جسم try، يتم التحقق من جسم catch الذي يتبع try.
إذا تم ذكر نوع الاستثناء الذي حدث في جسم catch، فإن طريقة نقل الاستثناء إلى جسم catch تشبه طريقة نقل المعلمات إلى معلمات الطريقة.
import java.io.File; import java.io.FileInputStream; public class Test { public static void main(String args[]){ System.out.println("Hello"); try{ File file = new File("my_file"); FileInputStream fis = new FileInputStream(file); } System.out.println("لا يمكن العثور على مسار الملف المحدد"); {} {} {}
نتائج الإخراج
لا يمكن العثور على مسار الملف المحدد
عند تخزين الاستثناء في جسم catch، يمكنك استخدام كلمة المفتاح throw (لإطلاق استثناء) لإعادة إطلاقه.
عند إعادة إطلاق الاستثناء، يمكنك إطلاق نفس الاستثناء دون الحاجة إلى تعديله
try { int result = (arr[a])/(arr[b]); System.out.println("Result of " + arr[a] + "/" + arr[b] + ": " + result); }catch(ArithmeticException e) { throw e; {}
أو، قم بتغليف الاستثناء في استثناء جديد وإطلاقه. عندما تغلف استثناء مخزن في استثناء آخر وإطلاقه، يُدعى ذلك بروابط الاستثناء أو تغليف الاستثناء، حيث يمكنك تعديل استثناءك، وإطلاق استثناء مستوى أعلى من الأبstraction.
try { int result = (arr[a])/(arr[b]); System.out.println("Result of " + arr[a] + "/" + arr[b] + ": " + result); }catch(ArrayIndexOutOfBoundsException e) { throw new IndexOutOfBoundsException(); {}
في هذا المثال Java، قد يطرح الكود في demoMethod() استثناء ArrayIndexOutOfBoundsException و ArithmeticException. تم التقاطع لهذه الاستثناءات في two مختلف catch blocks.
في جسم catch، نطرح استثناءين من خلال طلب استثناء أعلى مستوى، واستثناء آخر يطرح مباشرة.
import java.util.Arrays; import java.util.Scanner; public class RethrowExample { public void demoMethod() { Scanner sc = new Scanner(System.in); int[] arr = {10, 20, 30, 2, 0, 8}; System.out.println("Array: " + Arrays.toString(arr)); System.out.println("Choose numerator and denominator (not 0) from this array (enter positions 0 to 5)"); int a = sc.nextInt(); int b = sc.nextInt(); try { int result = (arr[a])/(arr[b]); System.out.println("Result of " + arr[a] + "/" + arr[b] + ": " + result); }catch(ArrayIndexOutOfBoundsException e) { throw new IndexOutOfBoundsException(); }catch(ArithmeticException e) { throw e; {} {} public static void main(String [] args) { new RethrowExample().demoMethod(); {} {}
نتائج الإخراج
المجموعة: [10, 20, 30, 2, 0, 8] اختر المعدل والمقام (لا يكون 0) من هذا المجموعة (ادخل المواضع 0 إلى 5) 0 4 استثناء في thread "main" java.lang.ArithmeticException: / by zero في at myPackage.RethrowExample.demoMethod(RethrowExample.java:16) في at myPackage.RethrowExample.main(RethrowExample.java:25)
نتائج الإخراج
المجموعة: [10, 20, 30, 2, 0, 8] اختر المعدل والمقام (لا يكون 0) من هذا المجموعة (ادخل المواضع 0 إلى 5) 124 5 استثناء في thread "main" java.lang.IndexOutOfBoundsException في at myPackage.RethrowExample.demoMethod(RethrowExample.java:17) في at myPackage.RethrowExample.main(RethrowExample.java:23)