اذهب إلى المحتوى
  • 0

ما هو المقصود بالاستثناءات exceptions في لغة جافا؟

khaled0mohammed

السؤال

Recommended Posts

  • 0

بالنسبة للسؤال الأول المذكور في العنوان "ما هو المقصود بالاستثناءات Exception"؟
الاستثناء هو حدث غير مرغوب فيه أو غير متوقع، يحدث أثناء تنفيذ البرنامج أي في وقت التشغيل run time أو في وقت الترجمة compile time، مما يعطل التدفق الطبيعي لتعليمات البرنامج.
ملاحظة: هناك فرق بين الخطأ Error والاستثناء، فالخطأ هو مشكلة تحدث بشكل رئيسي بسبب نقص موارد النظام  lack of system resources في وقت التشغيل، ولا يمكن التقاطه أو معالجته.
أمثلة على هذه الأخطاء هي OutOfMemoryError و LinkageError و AssertionError، إلخ.. وهي جميعاً تمثل صفوفاً فرعية subclasses من الصف Error.
لكن يشترك الخطأ والاستثناء في أنهما صفوف فرعية من الصف Java Throwable التي تنتمي إلى حزمة java.lang.
لن أدخل أكثر في تفاصيل الفروق بينهما لكي لانبتعد عن السؤال الأساسي.
بالنسبة للسؤال الثاني "ما هي انواع الاستثناءات في لغة جافا"؟
فهناك نوعين من الاستثناءات:

  • Checked Exceptions: تعني خطأ برمجي يحدث أثناء ترجمة البرنامج، وهي استثناءات يجب أن يتم التقاطها ومعالجتها من خلال كتلة catch أو من خلال جملة throws وإلا ستتسبب في إنهاء البرنامج وطباعة رسالة تتبع المكدس stack trace (تقرير عن إطارات المكدس النشطة في نقطة معينة من الوقت أثناء تنفيذ برنامج).
    أمثلة على هذه الاستثناءات هي SQLException و IOException و File Not Found Exception و No Such Field Exception و Interrupted Exception و No Such Method Exception و Class Not Found Exception إلخ..
    مثال برمجي:
    public class Main {
        public static void main(String[] args) {
            int s;
            s = "'s' should be String";
        }
    }

    رسالة الخطأ:

    Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types: java.lang.String cannot be converted to int

    هذا الخطأ يعني أن هناك مشكلة في النوع المستخدم لتخزين البيانات.
    ثم أخبرنا بسبب المشكلة و هي أنه لا يمكن تحويل الـString ل int , أي لا يمكن تخزين قيمة نوعها String في متغير نوعه int.

  • Unchecked Exception: تعني خطأ منطقي يحدث أثناء تشغيل البرنامج run time، وهذا النوع من الاستثناءات لايجب معالجته أو التقاطه أبداً، ولايقوم المترجم بالكشف عن هكذا استثناءات (أي على عكس النوع السابق)، حيث تقع على عاتق المبرمج مسؤولية التأكد من عدم حدوث هذه الأخطاء.
    أمثلة على هذه الاستثناءات No Such Element Exception و Undeclared Throwable Exception و Empty Stack Exception و Arithmetic Exception و Null Pointer Exception و Array Index Out of Bounds Exception و Security Exception و ArrayIndexOutOfBoundException. 
    مثال برمجي:
    public class Main {
        public static void main(String[] args) {
            int[] arr = { 4, 5 };
            System.out.println( arr[6] );
        } 
    }
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6

    هذا الخطأ يعني أن العنصر ليس موجود في المصفوفة، ثم أخبرنا بسبب المشكلة و هي أنه لم يجد عنصر يحمل الـ index رقم 6.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

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

مثال للتعامل مع الاستثناء:

try{
//	هنا نضع الكود الذي من الممكن ان يحدث به خطأ
}catch(Exception e){
// هنا يتم امساك الخط الذي حصل
}

انواع الاستثناءات: 

أ) استثناء محدد:
يتم فحص هذه الاستثناءات من قبل المترجم في وقت التجميع. تسمى الفئات التي توسع فئة Throwable باستثناء استثناء وقت التشغيل والخطأ "استثناء محدد".

يجب أن تعلن الاستثناءات المحددة عن الاستثناء باستخدام كلمة رئيسية محاطة بمحاولة / التقاط مناسبة.على سبيل المثال ، استثناء ClassNotFound

ب) استثناء لم يتم التحقق منه:
لم يتم فحص هذه الاستثناءات أثناء وقت الترجمة من قبل المترجم. لا يجبر المترجم على التعامل مع هذه الاستثناءات. مثل: الاستثناء الحسابي

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

من الأمثلة على الإستثناء التي لم يتم التحقق منها (Runtime exception) محاولة القسمة على رقم صفر 

int num1 = scanner.nextInt();
int num2 = scanner.nextInt();
System.out.println(num1/num2);

إن قام المُستخدم بإدخال رقم 0 في المرة الثانية سيتم وقتها حدوث خطأ القسمة على الصفر لأن هذا غير مقبول رياضيًا 

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

public class Main
{
    static String s;
	public static void main(String[] args) {
	    System.out.println(s.length());
		System.out.println("Hello World");
	}
}

حاولنا هنا الوصول إلى الدالة length الخاصة بالمتغير s ولكن لا يمكننا ذلك لأن المتغير s قيمته null حيث أنه لا يشير إلى أي مكان في الذاكرة حاليًا مما يؤدي إلى إلقاء خطأ nullPointerException 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...