1. ملخص استثناء جافا:
الاستثناء يعني التشغيل غير الطبيعي عند تشغيل البرنامج
1. أصل الاستثناء:
وصف المشكلات في الأشياء الحقيقية من خلال شكل فئات Java وختمها في كائن
في الواقع ، هذا هو مظهر الكائن بعد أن يصف Java المواقف غير الطبيعية.
2. هناك نوعان من المشاكل: أحدهما مشكلة خطيرة ، والآخر مشكلة خطيرة
للحالات الخطيرة ، تصفها جافا من خلال فئة الخطأ
الخطأ بشكل عام غير مكتوب لمعالجته.
بالنسبة إلى غير خطيرة ، تم وصف Java من قبل فئة الاستثناء
للاستثناء ، يمكنك استخدام طرق المعالجة المستهدفة للتعامل معها
3. تشمل الاستثناءات الشائعة: استثناءات زاوية الصفيف عبر الحدود ، استثناءات مؤشر فارغة ...
4. ما إذا كان خطأ أو استثناء لديه بعض المحتوى الشائع.
على سبيل المثال: أخبار غير طبيعية ، أسباب ، إلخ.
فئة رمي // قسط (يتم استخراج الفئتين التاليتين من نفس القواسم المشتركة)
|-برور
|-excption // فئتان فرعيتان (هناك العديد من المشكلات المحددة (حدوث استثناء)) /*اسم الفئة الأصل هو اسم لاحقة الفئة الفرعية* /
مثال 1: مثال على حدوث استثناء
class demo {public int div (int x ، int y) {return x/y ؛ }} class stisplydemo {public static void main (string args []) {demo d = new demo () ؛ int x = d.div (4،0) ؛ // 0 as sustem.out.println ("x ="+x) ؛ System.out.println ("Over") ؛ }}نتائج التشغيل:
استثناء في الموضوع "الرئيسي" java.lang.arithmeticexception: / by Zero
في DEMO.DIV (استثناء DESTER.JAVA:5)
في استثناء depemo.main (استثناء depemo.java:15)
من النتائج المذكورة أعلاه ، يمكننا تحليل أن استثناء حدث في كلا الخطين 5 و 15. وذلك لأن آلية التقسيم ، لا يمكن أن يكون المقسوم 0 ، وسيتم إلقاء استثناء عند تشغيل العملية.
مثال 2: مثال استثناء 2 ، تجاوز الذاكرة
class demo {public int div (int x ، int y) {return x/y ؛ }} class stisplydemo {public static void main (string args []) { /*demo d = new demo () ؛ int x = d.div (4،0) ؛ System.out.println ("x ="+x) ؛ System.out.println ("Over") ؛ */ byte [] arr = new byte [1024*1024*1000] ؛ }}نتائج التشغيل:
استثناء في الموضوع "الرئيسي" java.lang.outofmemoryerror: مساحة كومة جافا
في استثناء DESTERDEMO.MAIN (استثناء DESTERDEMO.JAVA:19)
java.lang.outofmemoryerror: يمثل استثناء الفائض الذاكرة
2. معالجة الاستثناء:
لمعالجة الاستثناءات ، توفر Java عبارات فريدة للمعالجة
شكل
يحاول
{
الكود الذي يجب اكتشافه ؛
}
يمسك
{
رمز للتعامل مع الاستثناءات ؛ (طريقة المعالجة)
}
أخيراً
{
الكود الذي سيتم تنفيذه بالتأكيد ؛ (طريقة المعالجة)
}
مثال 1: إثبات تجريب بيان الصيد
class demo {public int div (int x ، int y) {return x/y ؛ }} class stisplydemo {public static void main (string args []) {demo d = new demo () ؛ حاول {int x = d.div (4،0) ؛ System.out.println ("x ="+x) ؛ } catch (استثناء e) {system.out.println ("القسمة المطلقة") ؛ } system.out.println ("Over") ؛ /*byte [] arr = new byte [1024*1024*1000] ؛*/}}نتائج التشغيل:
هناك خطأ في المقسوم
زيادة
تحليل النتائج: عند تشغيل البرنامج ، عند تنفيذ بيان التقسيم: الإرجاع x/y ، يتم إنشاء كائن استثناء. New ArchTerCexception () ، يلتقط عبارة TRY هذا الكائن بمعلمات بيان الصيد.
استثناء e = new ArchTiMexception () ؛
بعد تشغيل بيان معالجة الصيد ، تتم معالجة المشكلة ، ويتم الانتهاء من البيان النهائي ، وانتهى الإخراج
مثال 2: إجراء عمليات طريقة مشتركة على كائنات الاستثناء التي تم التقاطها (طريقة رمي الفئة الأصل)
سلسلة getMessage () ؛ // احصل على معلومات استثناء
ToString () // إرجاع اسم الاستثناء: معلومات الاستثناء
printstacktrace () // الإخراج اسم الاستثناء ، معلومات الاستثناء ، موقع حدوث استثناء
class demo {public int div (int x ، int y) {return x/y ؛ }} class stisplydemo {public static void main (string args []) {demo d = new demo () ؛ حاول {int x = d.div (4،0) ؛ System.out.println ("x ="+x) ؛ } catch (استثناء e) {system.out.println ("القسمة المطلقة") ؛ // الحصول على معلومات استثناء system.out.println (E.GetMessage ()) ؛ // الحصول على معلومات استثناء ، اسم الاستثناء system.out.println (e.ToString ()) ؛ // الإخراج اسم الاستثناء ، معلومات الاستثناء ، الموقع حيث يحدث الاستثناء E.PrintStackTrace () ؛ } system.out.println ("Over") ؛ /*byte [] arr = new byte [1024*1024*1000] ؛*/}}نتائج التشغيل:
هناك خطأ في المقسوم
/ بواسطة الصفر
java.lang.arithmeticexception: / by Zero
java.lang.arithmeticexception: / by Zero
في DEMO.DIV (استثناء DESTER.JAVA:5)
في استثناء DESTERDEMO.MAIN (استثناء DESTERDEMO.JAVA:17)
زيادة
من تحليل نتائج التشغيل ، فإن آلية معالجة الاستثناء الافتراضي لـ JVM تدعو بالفعل طريقة printstacktrace.
مثال 3: طريقتان للتعامل مع رمي الاستثناء
1. رميها على الجهاز الظاهري JVM للمعالجة
2. تعامل مع الاستثناءات التي ألقيت بنفسك
Demo Class {public int div (int x ، int y) يرمي استثناء/*رميات الاستثناء حيث قد تحدث الاستثناءات*/{return x/y ؛ }} class stisplydemo {public static void main (string args []) {demo d = new demo () ؛ int x = d.div (4،0) ؛ System.out.println ("x ="+x) ؛ System.out.println ("Over") ؛ }}نتائج التشغيل:
استثناء Devel.java:15: خطأ: استثناء استثناء استثناء الاستثناء ؛ يجب أن يتم التقاطها أو إعلانها للرمي
int x = d.div (4،0) ؛
^
1 خطأ
تحليل النتائج: هذا لأنه لا تتم معالجة استثناءات
طريقة المعالجة 1: رمي باستمرار استثناءات واترك الجهاز الظاهري JVM يتعامل معه بنفسه
Demo Class {public int div (int x ، int y) يرمي استثناء/*رميات الاستثناء حيث قد تحدث الاستثناءات*/{return x/y ؛ }} class stisplydemo {public static void main (string args []) يلقي استثناء /*تواصل رمي الاستثناءات وإعطاء الجهاز الظاهري* / {demo d = new demo () ؛ int x = d.div (4،0) ؛ System.out.println ("x ="+x) ؛ System.out.println ("Over") ؛ }}طريقة المناولة 2: التعامل مع الاستثناءات بنفسك
Demo Class {public int div (int x ، int y) يرمي استثناء/*رميات الاستثناء حيث قد تحدث الاستثناءات*/{return x/y ؛ }} class stisplydemo {public static void main (string args []) {demo d = new demo () ؛ حاول // التعامل مع الاستثناء بنفسك {int x = d.div (4،0) ؛ System.out.println ("x ="+x) ؛ } catch (استثناء e) {system.out.println ("القسمة المطلقة") ؛ // الحصول على معلومات استثناء ، اسم الاستثناء system.out.println (e.ToString ()) ؛ System.out.println ("Over") ؛ }}}تلخيص:
إعلان استثناءات على الوظائف. من المريح تحسين الأمان ، والسماح بمعالجة مصدر المكالمات دون معالجة فشل التجميع.
مثال 4: التعامل مع استثناءات متعددة
1. عند الإعلان عن الاستثناءات ، يوصى إعلان استثناءات أكثر تحديدًا ، بحيث يمكن التعامل معها بشكل أكثر تحديداً.
2. أعلن عدة استثناءات ، وهناك العديد من كتل الصيد. لا تحدد الصيد غير الضروري بسرعة.
إذا كانت هناك علاقات ميراث في كتل الصيد المتعددة ، فسيتم وضع كتلة استثناء فئة الوالدين أدناه.
class demo {public int div (int x ، int y) يلقي ArithMeticeSception ، arrayIndExOutofBoundSexception {int arr [] = new int [x] ؛ system.out.println (arr [4]) ؛ إرجاع x/y ؛ }} class stisplydemo {public static void main (string args []) {demo d = new demo () ؛ حاول {int x = d.div (4،0) ؛ System.out.println ("x ="+x) ؛ } catch (ArithMeticexception e) / *dist يتم استلام كائن الاستثناء ، فإن التنفيذ الأول هو * / {system.out.println ("Divorceived Divisor") ؛ // الحصول على معلومات استثناء ، اسم الاستثناء system.out.println (e.ToString ()) ؛ System.out.println ("Over") ؛ } catch (ArrayIndExOutofBoundSexception e) / *تلقي الكائن مع بيانات خارج الحدود ، والتنفيذ الثاني هو * / {system.out.println ("Arrayout") ؛ // الإخراج استثناء المعلومات system.out.println (E.ToString ()) ؛ } catch (استثناء e) /*تلقي استثناء الفئة الأصل ، وقم بتنفيذه في النهاية. يوصى بعدم كتابة هذا ، دع البرنامج إنهاء*//*استخدام تعدد الأشكال*/ {system.out.println (E.ToString ()) ؛ }}}نتائج التشغيل:
الصفيف خارج الحدود
java.lang.arrayindexoutofboundsexception: 4
اقتراح:
عند معالجة الصيد ، يجب عليك تحديد طرق معالجة محددة في الصيد.
لا تحدد ببساطة eprintstacktrace ().
لا تكتب فقط بيان الإخراج
نظرًا لأن المستخدمين لا يستطيعون فهمه ، فمن الأفضل حفظه في ملف وإرساله إلى مطورينا لعرضه بانتظام.
مثال 5: استثناء مخصص
هل لاحظت أن الاستثناءات التي نستخدمها يتم تغليفها جميعًا في Java
ومع ذلك ، في التطوير الفعلي ، قد تكون الاستثناءات التي تظهر في برنامجنا هي أن Java غير مغلفة.
في هذا الوقت ، تحتاج إلى تعريفه بنفسك
وفقًا للرمز أعلاه ، حددت أن المقسوم لا يمكن أن يكون رقمًا سالبًا. الرمز كما يلي
Class Demo {public int div (int x ، int y) يلقي fushuexception/*أعلى استثناء*/{if (y <0) {رمي fushuexception جديد ("يحتوي المقام على رقم سالب ------/bu fushu" ، y) ؛ /*الكائن الذي يلقي الاستثناء يدويًا*/} إرجاع x/y ؛ }} class fushuexception يمتد الاستثناء {private int value ؛ fushuexception (String m ، int value) {super (m) ؛ /*تمرير المعلمات إلى طريقة getMessage لاستثناء الفئة الأصل*/ this.value = value ؛ } public int getValue () /*طريقة مخصصة ، إرجاع الرقم السالب* / {قيمة الإرجاع ؛ }} class stisplydemo {public static void main (string args []) {demo d = new demo () ؛ حاول {int x = d.div (4 ، -3) ؛ System.out.println ("x ="+x) ؛ } catch (fushuexception e) /*catch استثناء كائن* / {system.out.println (e.getMessage ()+e.getValue ()) ؛ } system.out.println ("Over") ؛ }}نتائج التشغيل:
يظهر رقم سالب في المقام ------/bu fushu-3
زيادة
من النتائج المذكورة أعلاه ، يمكننا أن نرى
في هذا البرنامج ، القسمة هي -3 ، والتي تعتبر أيضًا خطأ ولا يمكن تنفيذها.
ثم تحتاج إلى وصف مخصص لهذه المشكلة.
عند إلقاء كائن استثناء داخل الوظيفة ، يجب إعطاء إجراء المعالجة المقابل.
أو يتم التعامل معها داخليًا.
إما أن تعلن عن وظيفة المتصل للتعامل معها.
بشكل عام ، تظهر الاستثناءات في الوظيفة وتحتاج إلى الإعلان عن الوظيفة.
وقد وجد أنه لم يكن هناك سوى اسم الاستثناء في النتيجة المطبوعة ، ولكن لم يكن هناك معلومات استثناء.
لأن الاستثناء المخصص لا يحدد المعلومات.
كيف تحدد معلومات الاستثناء؟
نظرًا لأن تشغيل معلومات الاستثناء قد تم الانتهاء منه في الفئة الأصل.
لذلك ، تحتاج الفئة الفرعية فقط إلى نقل معلومات الاستثناء إلى الفئة الأصل عند بنائها من خلال البيان الفائق.
ثم يمكنك الحصول على معلومات استثناء مخصصة مباشرة من خلال طريقة getMessage.
يجب أن تكون الاستثناءات المخصصة استثناء من الفئة المخصصة للميراث.
ورث الاستثناء سبب:
يحتوي نظام الاستثناء على ميزة: لأنه يتم طرح كل من فئات الاستثناء وكائنات الاستثناء.
انهم جميعا يمكن رمي. هذه القابلية للتأثير هي ميزة فريدة من نوعها لنظام الرمي.
يمكن تشغيل الفئات والكائنات في هذا النظام فقط بواسطة رميات ورميات.
الفرق بين الرميات ورمي
يتم استخدام الرميات على الوظائف.
يتم استخدام رمي داخل الوظيفة.
فئة الاستثناء تليها رميات. يمكن أن يتبعها متعددة. مفصولة بفواصل.
يتبع رمي كائن الاستثناء.
مثال 6: هناك استثناء من الفئة الفرعية الخاصة في استثناء RunTimeException
إذا تم طرح الاستثناء في محتوى الوظيفة ، فيمكن إعلان الوظيفة دون إعلان وسيتم تمرير التجميع.
إذا تم الإعلان عن الاستثناء في الوظيفة ، فلن يتمكن المتصل من معالجتها ، وسيتم إجراء التجميع من خلال
السبب في أنه ليس من الضروري إعلان الوظيفة هو أن المتصل لا يحتاج إلى التعامل معها.
عندما يحدث هذا الاستثناء ، آمل أن يتوقف البرنامج ، لأنه لا يمكن تشغيله أثناء التشغيل. آمل أن يتوقف البرنامج بعد توقف البرنامج.
قام المبرمج بتعديل الكود.
Demo Class {public int div (int x ، int y) يلقي fushuexception/*نتيجة الرمي أو عدم الرمي هي نفسها*/{if (y <0) {رمي fushuexception جديد ("المقام لديه رقم سالب ------/bu fushu" ، y) ؛ } إرجاع x/y ؛ }} class fushuexception يمتد RunTimeException /*الوراثة RunTimeException* /{fushuexception (String m ، int value) {super (m) ؛ }} class stisplydemo {public static void main (string args []) {demo d = new demo () ؛ int x = d.div (4 ، -3) ؛ /*سيظهر الاستثناء بعد تشغيل هذا ، لن تكون هناك مشكلة في التجميع*/ system.out.println ("x ="+x) ؛ System.out.println ("Over") ؛ }}نتائج التشغيل:
استثناء في الخيط "الرئيسي" Fushuexception: يظهر الرقم السلبي في المقام ------/BU FUSHU
في DEMO.DIV (استثناء DOSTEDEMO.JAVA:7)
في استثناء depemo.main (استثناء depemo.java:26)
من النتائج المذكورة أعلاه ، يمكننا أن نرى:
عندما يكون الاستثناء المخصص: في حالة حدوث الاستثناء ، لا يمكن استمرار العملية.
دع الاستثناء المخصص يرث RunTimeException.
للاستثناءات ، هناك نوعان:
1. استثناء تم اكتشافه أثناء التجميع.
2. استثناء لم يتم الكشف عنه أثناء التجميع (استثناء وقت التشغيل. RunTimeException والفئات الفرعية)
إن المقالة أعلاه تتفهم بشكل شامل أن آلية معالجة الاستثناءات في Java هي كل المحتوى الذي شاركته معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.