1. ما هو الاستثناء؟
أولاً ، دعنا نلقي نظرة على المثال في الشكل أدناه:
في هذا المثال ، يوجد رمز الخطأ بالقسمة على 0. استثناء بسبب تقسيمه على 0: ArithMeticeSception
HelloException.java
package com.yiibai.tutorial.Exception ؛ public class helloException {public static void main (string [] args) {system.out.println ("three") ؛ // هذا القسم لا مشكلة. قيمة int = 10 /2 ؛ System.out.println ("Two") ؛ // هذا القسم لا مشكلة. القيمة = 10/1 ؛ System.out.println ("One") ؛ // هذا القسم لديه مشكلة ، مقسومًا على 0. // حدث خطأ هنا. القيمة = 10/0 ؛ // ولن يتم تنفيذ الكود التالي. System.out.println ("دعنا نذهب!") ؛ }}سيؤدي تشغيل هذا المثال إلى:
يمكنك رؤية الإخطارات على شاشة وحدة التحكم. إشعارات الخطأ واضحة للغاية ، بما في ذلك المعلومات على أسطر الكود.
لنلقي نظرة على البرنامج التالي من خلال العملية في الشكل أدناه:
سنقوم بتعديل رمز التجسيد المذكور أعلاه.
HellocatchException.java
package com.yiibai.tutorial.Exception ؛ public class helloCatchException {public static void main (string [] args) {system.out.println ("three") ؛ // هذا القسم لا مشكلة. قيمة int = 10 /2 ؛ System.out.println ("Two") ؛ // هذا القسم لا مشكلة. القيمة = 10/1 ؛ System.out.println ("One") ؛ حاول {// أن هذا القسم لديه مشكلة ، مقسومًا على 0. // حدث خطأ هنا. القيمة = 10/0 ؛ // ولن يتم تنفيذ الكود التالي. system.out.println ("value =" + value) ؛ } catch (ArithMeticexception e) {// سيتم تنفيذ الكود في كتلة catch system.out.println ("خطأ:" + e.getMessage ()) ؛ // سيتم تنفيذ الكود في كتلة catch system.out.println ("تجاهل ...") ؛ } // يتم تنفيذ هذا الرمز system.out.println ("دعنا نذهب!") ؛ }}تشغيل نتائج العينة:
ثلاثة
اثنين
واحد
خطأ: / بواسطة الصفر
يتجاهل...
دعنا نذهب!
سنشرح الإجراء التالي كما يلي تدفق صورة المثال.
2. التسلسل الهرمي الاستثناء <br /> هذا نموذج للرسم البياني الهرمي لاستثناءات Java.
أعلى فئة هي: رمي
الفئات الفرعية المباشرة هما خطأ واستثناء.
هناك فئة فرعية RunTimeException في نقل الاستثناء ، بما في ذلك استثناءات وقت الترجمة لم يتم فحصها في Java. تحقق وإلغاء الشيك في وقت الترجمة ، كما هو موضح في القسم التالي من مثال التنفيذ.
ملاحظة: يجب أن يرث فصلك من فرعين: خطأ أو استثناء ، وليس مباشرة من رمي.
يرفع الجهاز الظاهري هذا الخطأ عند فشل الارتباط الديناميكي ، أو عند حدوث بعض الفشل "الصلب" الآخر للجهاز الظاهري. لا ترتدي برامج Java النموذجية أخطاء ، لذلك لا ترمي برامج Java أي أخطاء. معظم البرامج ترمي والتقاط الكائنات المستمدة من فئة الاستثناء. يشير الاستثناء إلى مشكلة ، لكن هذه المشكلات ليست مشاكل جهازية خطيرة. معظم البرامج التي تكتبها سوف ترمي وتلتقط الاستثناءات.
تحدد فئة الاستثناء العديد من الفئات الفرعية في حزمة Java. تشير هذه الفئات الفرعية إلى أن أنواع الاستثناءات المختلفة قد تحدث. على سبيل المثال ، يشير NegatiVearraysizeException إلى أن البرنامج يحاول إنشاء مجموعة من الحجم السلبي.
معنى خاص للفئة الفرعية للمخرج في لغة Java: تمثل فئة RunTimeException استثناءًا يحدث (أثناء وقت التشغيل) في جهاز Virtual Java. مثال على استثناء وقت التشغيل هو استثناء nullyiibaierexception ، والذي يتم رفعه عندما تحاول طريقة ما الوصول إلى عضو في كائن من خلال مرجع فارغ. يمكن أن يظهر NullyiibaieRexception في أي مكان يحاول فيه البرنامج إخلاء كائن. فوائد التحقق من الاستثناء في كثير من الأحيان تفوق تكاليفها.
نظرًا لأن استثناءات وقت التشغيل موجودة في كل مكان ، فمن غير المجدي محاولة التقاط أو تحديد كل الوقت (رمز غير قابل للقراءة ولا يمكن صيانته) ، يتيح المترجم استثناءات وقت التشغيل غير معلوم وتحديد.
تحدد حزمة Java عدة فئات RunTimeException. يمكنك التقاط هذه الاستثناءات ، تمامًا مثل الآخرين. ولكن ليست هناك حاجة لطريقة لتحديد أنها ترمي استثناء وقت التشغيل. بالإضافة إلى ذلك ، يمكنك إنشاء فئة فرعية RunTimeException الخاصة بك. استثناءات وقت التشغيل - تحتوي المناقشة أدناه على مناقشة متعمقة حول متى وكيفية استخدام استثناءات وقت التشغيل. 3. استخدم Try-Catch للتعامل مع الاستثناءات
كتابة الفصول الدراسية الموروثة من الاستثناء.
AgeException.java
package com.yiibai.tutorial.exception.basic ؛ الطبقة العامة AgeException يمتد الاستثناء {public AgeException (string message) {super (message) ؛ }} tooyoungexception.javapackage com.yiibai.tutorial.exception.basic ؛ الطبقة العامة tooyoungexception يمتد AgeException {public tooyoungexception (رسالة سلسلة) {super (message) ؛ }} fooldException.java
package com.yiibai.tutorial.exception.basic ؛ فئة public fooldException يمتد AgeException {public fooldException (رسالة سلسلة) {super (message) ؛ }} والطريقة الثابتة لفحص العمر لفئة AgeUtils.
AgeUtils.java
حزمة com.yiibai.tutorial.exception.basic ؛ الطبقة العامة ageutils {// هذه الطريقة تتحقق من العمر. // إذا كان العمر أقل من 18 عامًا ، فسترمي الطريقة استثناء Tooyoungexception // إذا كان عمر أكبر من 40 عامًا ، فسترمي الطريقة استثناءً من الفراغ الفراغ الثابت بشكل عام (int). رمي tooyoungexception الجديد ("Age" + Age + "Yound") ؛ } آخر إذا (العمر> 40) {// إذا كان العمر أكبر من 40 ، فسيتم طرح استثناء. // تنتهي هذه الطريقة هنا. رمي جديد foroLdException ("Age" + Age + "Old Old") ؛ } // إذا كان العمر بين 18-40. // سيتم تنفيذ هذا الرمز. System.out.println ("Age" + Age + "OK!") ؛ }} تحقق من الاستثناءات والاستثناءات غير المحددة:
AgeException هو استثناء ، والفئة الفرعية لـ FooldException و Tooyoungexception2 هي فئات فرعية مباشرة من AgeException ، لذلك يتم "استثناء مستثمر"
ألقى طريقة AgeUtils.checkage (int) استثناءً وتحتاج إلى سرد إعلانات الطريقة من خلال الكلمة الرئيسية "رميات". أو يمكنك إعلان رمي المزيد من المستويات.
يجب أيضًا معالجة موقع AgeUtils.checkage (int) لالتقاط الاستثناء أو الاستمرار في رميه.
يتم التحقق من "استثناء فحص" بواسطة "جافا بروتوكيلاند".
هناك خياران:
trycatchdemo1.java
package com.yiibai.tutorial.exception.basic ؛ public class trycatchdemo1 {public static void main (string [] args) {system.out.println ("" ابدأ التوظيف ... ") ؛ // تحقق من نظام العمر. out.println ("تحقق من عمرك") ؛ int العمر = 50 ؛ جرب {ageUtils.checkage (العمر) ؛ System.out.println ("أنت تمرير!") ؛ } catch (tooyoungexception e) {// افعل شيئًا هنا .. system.out.println ("أنت صغير جدًا ، لا تمر!") ؛ System.out.println (E.GetMessage ()) ؛ } catch (foololdException e) {// افعل شيئًا هنا .. system.out.println ("أنت كبير السن ، لا تمر!") ؛ System.out.println (E.GetMessage ()) ؛ }}} في المثال التالي ، سنقوم بالاستثناء (فئة hyperexception) من خلال فئة الأصل.
Trycatchdemo2.java
package com.yiibai.tutorial.exception.basic ؛ الطبقة العامة trycatchdemo2 {public static void main (string [] args) {system.out.println ("" ابدأ التوظيف ... ") ؛ // تحقق من نظام العمر. out.println ("تحقق من عمرك") ؛ عمري = 15 ؛ جرب {// هنا يمكن أن يرمي fooldException أو tooyoungexception ageutils.checkage (العمر) ؛ System.out.println ("أنت تمرير!") ؛ } catch (AgeException e) {// في حالة حدوث استثناء ، سيتم تنفيذ نوع AgeException // كتلة catch System.out.println ("عمرك غير صالح ، أنت لا تمر") ؛ System.out.println (E.GetMessage ()) ؛ }}} يمكن أيضًا تجميع استثناءات مختلفة في كتل للتعامل معها إذا تم التعامل معها بنفس الطريقة مع البرنامج المنطقي.
trycatchdemo3.java
package com.yiibai.tutorial.exception.basic ؛ public class trycatchdemo3 {public static void main (string [] args) {system.out.println ("" ابدأ التوظيف ... ") ؛ // تحقق من نظام العمر. out.println ("تحقق من عمرك") ؛ عمري = 15 ؛ جرب {// هنا يمكن أن يرمي fooldException أو tooyoungexception ageutils.checkage (العمر) ؛ System.out.println ("أنت تمرير!") ؛ } catch (tooyoungexception | fooldException e) {// catch multi stivents في كتلة واحدة. System.out.println ("عمرك غير صالح ، أنت لا تمر") ؛ System.out.println (E.GetMessage ()) ؛ }}} 4. المحاولة-فونالي
لقد اعتدنا على اصطياد الأخطاء من خلال كتل التجربة. جرب----للتعامل مع الاستثناءات تمامًا.
جرب {// افعل شيئًا هنا} catch (استثناء 1 e) {// افعل شيئًا هنا} catch (استثناء 2 e) {// افعل شيئًا هنا} أخيرًا {// أخيرًا يتم تنفيذ block // افعل شيئًا هنا} trycatchfinallydemo.java
package com.yiibai.tutorial.exception.basic ؛ الطبقة العامة trycatchfinallydemo {public static void main (string [] args) {String text = "001234a2" ؛ int value = tointeger (text) ؛ system.out.println ("value =" + value) ؛ } int tointeger static static (text string) {try {system.out.println ("start parse text:" + text) ؛ // يمكن أن يرمي استثناء هنا (numberFormatexception). int value = integer.parseint (text) ؛ قيمة الإرجاع } catch (numberFormatexception e) {// في حالة "النص" ليس رقمًا. // سيتم تنفيذ كتلة الصيد هذه. System.out.println ("استثناء تنسيق الرقم" + E.GetMessage ()) ؛ // إرجاع 0 إذا حدث numberFormatexception Return 0 ؛ } أخيرًا {system.out.println ("End Parse Text:" + text) ؛ }}}هذه هي عملية البرنامج. سيتم دائمًا تنفيذ الكتلة أخيرًا تحت أي ظرف من الظروف.
5. استثناء المحيط
شخص
package com.yiibai.tutorial.exception.wrap ؛ public class person {public static final string = "male" ؛ السلسلة النهائية الثابتة العامة = "أنثى" ؛ اسم السلسلة الخاصة ؛ سلسلة جنسية خاصة ؛ عصر INT الخاص ؛ الشخص العام (اسم السلسلة ، سلسلة الجنس ، int ins) {this.name = name ؛ this.gender = الجنس ؛ this.age = العمر ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } السلسلة العامة getGender () {return الجنس ؛ } public void setgender (سلسلة الجنس) {this.gender = الجنس ؛ } public int getage () {return Age ؛ } public void setage (int age) {this.age = age ؛ }} genderexception.java
package com.yiibai.tutorial.exception.wrap ؛ // استثناء الجنس. فئة Public Class Genderexception يمتد الاستثناء {public genderexception (رسالة سلسلة) {super (message) ؛ }} حزمة فئة ValiathException لها استثناءات أخرى.
validateException.java
package com.yiibai.tutorial.exception.wrap ؛ فئة publicaledexception يمتد الاستثناء {// لف استثناء publidateException (استثناء e) {super (e) ؛ }} Valatedutils.java
package com.yiibai.tutorial.exception.wrap ؛ import com.yiibai.tutorial.exception.basic.ageutils ؛ فئة عامة ValuatedUtils {public static void checkperson (شخص شخص) يلقي ValidateException {// Check Age. // صالحة إذا كان ما بين 18-40 // يمكن أن ترمي هذه الطريقة foroLdException ، tooyoungexception. AgeUtils.checkage (person.getage ()) ؛ } catch (استثناء e) {// إذا لم يكن صحيحًا / / لف هذا الاستثناء عن طريق ValativeException ، ورمي validateException (e) ؛ } // إذا كان هذا الشخص أنثى ، أي غير صالح. if (person.getgender (). يساوي (person.female)) {genderexception e = new genderexception ("لا تقبل النساء") ؛ رمي validateException (E) ؛ }}} wrapperexceptiondemo.java
package com.yiibai.tutorial.exception.wrap ؛ الطبقة العامة wrapperexceptiondemo {public static void main (string [] args) {// واحد توظيف مشارك. شخص الشخص = شخص جديد ("الزواج" ، شخص. الإناث ، 20) ؛ جرب {// قد تحدث الاستثناءات هنا. ValateTutils.Checkperson (شخص) ؛ } catch (valithException Wrap) {// احصل على السبب الحقيقي. // قد يكون tooyoungexception ، fooldException ، استثناء genderexception السبب = (استثناء) wrap.getCause () ؛ if (cause! = null) {system.out.println ("لا تمرير ، السبب:" + cause.getMessage ()) ؛ } آخر {system.out.println (wrap.getMessage ()) ؛ }}}}6. RunTimeException والفئات الفرعية ، فئة RunTimeException ودراساتها الفرعية كلاهما "استثناءات غير محددة". لا يتم فحصه في وقت الترجم بواسطة برنامج التحويل البرمجي Java. في بعض الحالات ، يمكنك أن ترث من هذا الفرع لكتابة استثناءاتك الخاصة.
فيما يلي بعض الفصول التي تنتمي إلى فرع RunTimeException (بالطبع ، هذا ليس كل شيء).
بعض الأمثلة على استثناءات التعامل مع هذا النوع:
6.1- Nullyibaierexception
هذا هو الاستثناء الأكثر شيوعًا وعادة ما يسبب أخطاء في البرنامج. يتم إلقاء الاستثناء عند استدعاء طريقة أو الوصول إلى حقل كائن فارغ.
nullyiibaierexceptiondemo.java
package com.yiibai.tutorial.exception.runtime ؛ الطبقة العامة nullyibaierexceptiondemo {// على سبيل المثال ، إليك طريقة يمكنها إرجاع سلسلة فارغة. السلسلة الثابتة العامة getString () {if (1 == 2) {return "1 == 2 !!" ؛ } إرجاع فارغ ؛ } الفراغ الثابت العام الرئيسي (سلسلة [] args) {// هذا كائن يشير إلى عدم وجود فارغ. String Text1 = "Hello Scression" ؛ // استدعاء الطريقة استرداد طول السلسلة. طول int = text1.length () ؛ system.out.println ("length text1 =" + length) ؛ // هذا كائن يشير إلى فارغة. text text2 = getTring () ؛ // استدعاء الطريقة استرداد طول السلسلة. // سيحدث nullyiibaierexception هنا. // إنه استثناء يحدث في وقت التشغيل (نوع RunTimeException) // لا يجالك برنامج التحويل البرمجي Javac استخدام كتلة التجربة لمعالجة طولها = text2.length () ؛ System.out.println ("Finish!") ؛ }}نتائج تشغيل المثال:
في الواقع ، يمكن استخدام Try-Catch للقبض على هذا الاستثناء والتعامل معه مثل التعامل مع الاستثناءات الأخرى. ومع ذلك ، هذا ميكانيكي وعادة ما يجب أن نتحقق منه للتأكد من أن الكائن ليس فارغًا قبل استخدامه.
يمكنك تصحيح الكود أعلاه لجعله مشابهًا لما يلي لتجنب استثناءات المؤشر الفارغ:
// هذا هو كائن خالي
6.2- ArrayIndExofBoundException
يحدث هذا الاستثناء عند محاولة الوصول إلى عنصر صفيف مع فهرس غير صالح. على سبيل المثال ، يحتوي المصفوفة على 10 عناصر للوصول ، لكنك تصل إلى عناصر مع الفهرس 20.
ArrayIndexofBoundSexceptionDemo.java
package com.yiibai.tutorial.exception.runtime ؛ public class arrayIndExofBoundSexceptionDemo {public static void main (string [] args) {string [] strs = new string [] {"one" ، "اثنين" ، "ثلاثة"} ؛ // الوصول إلى العنصر لديه فهرس 0. String str1 = strs [0] ؛ System.out.println ("String at 0 =" + Str1) ؛ // الوصول إلى العنصر لديه فهرس 5. // ArrayIndExofBoundSexception يحدث هنا. سلسلة str2 = strs [5] ؛ System.out.println ("String at 5 =" + str2) ؛ }} لتجنب ArrayIndExofBoundSexception ، يجب أن نكون أكثر حول التحقق من الصفيف من استخدام Try-Catch.
if (strs.length> 5) {String str2 = strs [5] ؛ System.out.println ("String at 5 =" + str2) ؛} آخر {system.out.println ("لا عناصر مع الفهرس 5") ؛}ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون مفيدًا لتعلم الجميع.