الاختلافات بين الاستثناء والخطأ
سؤال
أحاول معرفة المزيد عن جافا الأساسية وأنواع مختلفة من الألغام، هل يمكن لشخص ما اسمحوا لي أن أعرف الاختلافات بين الاستثناءات والأخطاء؟
المحلول
لا ينبغي القبض على الأخطاء أو التعامل معها (إلا في أندر الحالات). الاستثناءات هي الخبز والزبدة من التعامل مع الاستثناء. ال جافادوك يفسرها جيدا:
خطأ هو فئة فرعية من الرمانية التي تشير إلى مشاكل خطيرة لا ينبغي أن يحاول تطبيق معقول التقاطه. معظم هذه الأخطاء ظروف غير طبيعية.
انظر إلى عدد قليل من الفئات الفرعية من Error
, ، أخذ بعض تعليقات جافادوك الخاصة بهم:
AnnotationFormatError
- ألقيت عندما يحاول محلل التوضيحي قراءة التوضيح من ملف فئة وتحدد أن التوضيحية مشوهة.AssertionError
- ألقيت للإشارة إلى أن التأكيد قد فشل.LinkageError
- تشير الفئات الفرعية ل LinkageError إلى أن الفصل يحتوي على بعض الاعتماد على فئة أخرى؛ ومع ذلك، تغيرت الطبقة الأخيرة بطريقة غير متوافقة بعد تجميع الطبقة السابقة.VirtualMachineError
- ألقيت الإشارة إلى أن جهاز Java الظاهري مكسور أو ينفد من الموارد اللازمة لذلك لمواصلة التشغيل.
هناك حقا ثلاث فئات فرعية مهمة من Throwable
:
Error
- حدث شيء شديد بما فيه الكفاية على أن معظم التطبيقات يجب أن تحطمها بدلا من محاولة التعامل مع المشكلة،- استثناء غير محدد (ويعرف أيضا باسم
RuntimeException
) - في كثير من الأحيان خطأ برمجة مثلNullPointerException
أو حجة غير قانونية. يمكن أن تتعامل التطبيقات في بعض الأحيان أو التعافي من هذاThrowable
الفئة - أو على الأقل قبض عليه في الخيطrun()
الطريقة، سجل الشكوى، ومتابعة التشغيل. - تم التحقق من الاستثناء (ويعرف أيضا باسم كل شيء آخر) - من المتوقع أن تكون التطبيقات قادرة على التقاط وشيء ما مع الراحة، مثل
FileNotFoundException
وTimeoutException
...
نصائح أخرى
هذه الشريحة عرض التسلسل الهرمي استثناء جافا بواسطة @ جورجيوس-جوسيوس تفسر بالتيقام الاختلافات بين الأخطاء والاستثناءات في جافا.
تميل الأخطاء إلى الإشارة إلى نهاية طلبك كما تعلمونه. عادة لا يمكن استردادها من ويجب أن يخرج VM الخاص بك. لا ينبغي إجراء اصطيادهم إلا حتى ربما سجل أو عرض ورسالة مناسبة قبل الخروج.
مثال: outofmemoryError. - ليس كثيرا يمكنك القيام به كبرنامجك لم يعد بإمكانك تشغيله.
غالبا ما تكون الاستثناءات قابلة للاسترداد وحتى عندما لا تكون كذلك، فإنها تعني عموما فشل عملية فشلت، لكن برنامجك لا يزال بإمكانه الاستمرار.
مثال: غير قانوني - مرت بيانات غير صالحة إلى طريقة فشلت استدعاء الأسلوب، لكنها لا تؤثر على العمليات المستقبلية.
هذه أمثلة مبسطة، وهناك ثروة أخرى من المعلومات حول استثناءات فقط وحدها.
الشمس يضعها بشكل أفضل:
خطأ هو فئة فرعية من الرمانية التي تشير إلى مشاكل خطيرة لا ينبغي أن يحاول تطبيق معقول التقاطه.
أخطاء -
Error
S في جافا من النوعjava.lang.Error
.- جميع الأخطاء في Java نوع غير محدد.
Error
يحدث في وقت التشغيل. لن يعرفوا الترجمة.- من المستحيل التعافي من الأخطاء.
Error
غالبا ما تسببها البيئة في أي تطبيق قيد التشغيل.- أمثلة :
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exception
S في جافا من النوعjava.lang.Exception
.Exception
قم بتضمين كلا من النوع الذي تم التحقق منه بالإضافة إلى نوع غير محدد.- من المعروف أن الاستثناءات المحددة للمترجم حيث لا يعرف استثناءات غير محددة بالمترجم لأنها تحدث في وقت التشغيل.
- يمكنك التعافي من الاستثناءات عن طريق التعامل معها من خلال
try-catch
كتل. Exception
ناتجة أساسا عن التطبيق نفسه.- أمثلة : استبصارات فحص:
SQLException
,IOException
استثناءات غير محددة:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
قراءة متعمقة : http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
وصف الوصف Error
الطبقة واضحة تماما:
أ
Error
هي فرعية منThrowable
وهذا يشير إلى مشاكل خطيرة في أن تطبيق معقول يجب ألا يحاول التقاطه. معظم هذه الأخطاء ظروف غير طبيعية. الThreadDeath
خطأ، على الرغم من حالة "طبيعية"، هي أيضا فرعية منError
لأن معظم التطبيقات يجب ألا تحاول اللحاق بها.طريقة غير مطلوبة للإعلان في بند رمياتها أي فرعية من
Error
قد يتم إلقاؤه أثناء تنفيذ الطريقة ولكن لم يتم القبض عليه، لأن هذه الأخطاء هي ظروف غير طبيعية لا ينبغي أن تحدث أبدا.
استشهد من جافا الخاصة توثيق الفصل Error
.
باختصار، يجب أن لا تصطاد Error
S، إلا أن لديك سبب وجيه للقيام بذلك. (على سبيل المثال لمنع تنفيذ برنامج الويب الخاص بك إلى تحطم الطائرة إذا نفاد Servlet عن الذاكرة أو شيء من هذا القبيل.)
أ Exception
, من ناحية أخرى، هو مجرد استثناء طبيعي كما هو الحال في أي لغة حديثة أخرى. ستجد وصفا مفصلا في وثائق Java API أو أي مورد عبر الإنترنت أو غير متصل.
هناك العديد من أوجه التشابه والاختلافات بين الطبقات java.lang.Exception
و java.lang.Error
.
التشابه:
أولا - كلا الفصلين يمتد
java.lang.Throwable
وكما يؤدي نتيجة العديد من الأساليب الشائعة لاستخدامها عند التعامل مع الأخطاء مثل:getMessage
,getStackTrace
,printStackTrace
وما إلى ذلك وهلم جرا.ثانيا، باعتبارها فرعية من
java.lang.Throwable
كلاهما يرث بعد الخصائص التالية:قابلة للإزالة نفسها وأي من الفئات الفرعية (بما في ذلك
java.lang.Error
) يمكن إعلانها في قائمة استثناءات الأسلوب باستخدامthrows
الكلمة الرئيسية. هذا الإعلان مطلوب فقط لjava.lang.Exception
والفئات الفرعية، لjava.lang.Throwable
,java.lang.Error
وjava.lang.RuntimeException
وفئات الفئات الفرعية لها اختيارية.فقط
java.lang.Throwable
وسماح لها الفئات الفرعية المستخدمة فيcatch
بند.فقط
java.lang.Throwable
ويمكن استخدام الفئات الفرعية مع الكلمة الرئيسية -throw
.
الاستنتاج من هذه الخاصية يتابع كليهما java.lang.Error
و java.lang.Exception
يمكن الإعلان عنها في رأس الطريقة، يمكن أن يكون في catch
جملة، يمكن استخدامها مع الكلمة الرئيسية throw
.
اختلافات:
الأول - الفرق المفاهيمي:
java.lang.Error
تم تصميمه ليتم إلقاؤه بواسطة JVM ويشير إلى مشاكل خطيرة وتهدف إلى إيقاف تنفيذ البرنامج بدلا من الوقوع (ولكن من الممكن أما بالنسبة لأي شيء آخرjava.lang.Throwable
خليفة).مرور من جافادوك الوصف
java.lang.Error
:... يشير إلى مشاكل خطيرة في أن تطبيق معقول يجب ألا يحاول التقاطه.
في المقابل
java.lang.Exception
تم تصميمه لتمثيل الأخطاء المتوقعة ويمكن التعامل معها بواسطة مبرمج دون إنهاء تنفيذ البرنامج.مرور من جافادوك الوصف
java.lang.Exception
:... يشير إلى الشروط التي قد ترغب فيها تطبيق معقول في التقاطه.
- الفرق الثاني بين
java.lang.Error
وjava.lang.Exception
التي تعتبر لأول مرة لم يتم التحقق منه استثناء لفحص استثناء وقت الترجمة. كما رمي رمز النتيجةjava.lang.Error
أو لا تتطلب الفئات الفرعية الخاصة بها إعلان هذا الخطأ في رأس الطريقة. أثناء رميjava.lang.Exception
الإعلان المطلوب في رأس الطريقة.
IMO خطأ هو شيء يمكن أن يسبب فشل طلبك ويجب عدم التعامل معه. استثناء هو شيء يمكن أن يسبب نتائج غير متوقعة، ولكن يمكن استردادها من.
مثال:
إذا نفاد البرنامج من الذاكرة، فهذا خطأ حيث لا يمكن أن يستمر التطبيق. ومع ذلك، إذا قبل البرنامج نوع إدخال غير صحيح، فهذا استثناء، حيث يمكن للبرنامج التعامل معه وإعادة توجيه تلقي نوع الإدخال الصحيح.
إليك ملخص جيد جدا من Java API ما يمثل الخطأ والاستثناء:
خطأ هو فئة فرعية من الرمانية التي تشير إلى مشاكل خطيرة لا ينبغي أن يحاول تطبيق معقول التقاطه. معظم هذه الأخطاء ظروف غير طبيعية. خطأ ThreadDeath، على الرغم من شرط "طبيعي"، هو أيضا فئة واحدة من الخطأ لأن معظم التطبيقات يجب ألا تحاول التقاطه.
لا يلزم أن تعلن الطريقة أن تعلن في رمياتها بإمكان أي فرعية من الأخطاء التي قد يتم إلقاؤها أثناء تنفيذ الطريقة ولكن لم يتم القبض عليها، لأن هذه الأخطاء تتعرض لظروف غير طبيعية لا ينبغي أن تحدث أبدا.
Otoh، للحصول على استثناءات، يقول جافا أبى:
استثناء الفصل وعلم الفئات الفرعية هو شكل من أشكال الرمانية التي تشير إلى شروط قد ترغب تطبيق معقول في التقاطه.
الناجمة أساسا الناجمة عن البيئة في أي تطبيق قيد التشغيل. على سبيل المثال، يحدث outofmemoryError عندما ينفد JVM من الذاكرة أو يحدث contackoverflowerror عندما يفيض المكدس.
تسبب الاستثناءات أساسا عن التطبيق نفسه. على سبيل المثال، يحدث nullpointerException عندما يحاول تطبيق الوصول إلى كائن فارغ يحدث أو يحدث ClasscastException عندما يحاول تطبيق أن يلقي أنواع فئة غير متوافقة.