الإعلانات

يشير الاستثناء في البرمجة إلى حالة استثنائية في مرحلة ما من تنفيذ البرنامج. يتم استخدامه عندما يمكن التعامل مع الحالة الاستثنائية بشكل أفضل في مكان آخر بدلاً من مكان مواجهتها. خذ بعين الاعتبار الأمثلة التالية:

  • يمكن معالجة الفشل في فتح ملف التكوين بشكل أفضل في التعليمات البرمجية ، ربما باستخدام موقع ملف تكوين بديل.
  • الوصول إلى عنصر صفيف كيفية استخدام Java ArrayListإن مصفوف جافا عبارة عن مصفوفة قابلة لتغيير الحجم للأغراض العامة. يوفر معظم التسهيلات المتوقعة بشكل عام للصفائف بلغات أخرى. في هذه المقالة ستتعلم كيفية إعداد واستخدام arraylist. اقرأ أكثر يشير خارج حدود الصفيف إلى خطأ برنامج. تصحيح الأخطاء!
  • يجب أن يخطر المستخدم خطأ تحليل XML حتى يمكن تصحيح ملف XML.
  • يمكن تصحيح البرنامج الذي ينفد من الذاكرة (ربما عند معالجة ملف كبير) عن طريق زيادة حجم الذاكرة المتاحة لعملية جافا.

في جميع هذه الحالات (وأكثر) ، يجب معالجة الاستثناء خارج الموقع الذي تم إنشاؤه فيه حتى يمكن معالجة السبب الأساسي.

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

توضح الصورة أدناه الأجزاء الرئيسية من التسلسل الهرمي لاستثناءات جافا. الفئة الأساسية هي

instagram viewer
رمي والتي يتم تصنيفها إلى فئات فرعية استثناء و خطأ. صف دراسي استثناء للظروف المتعلقة بالبرنامج التي يمكن للتطبيقات التقاطها في محاولة لإنقاذ الموقف. صف دراسي خطأ، من ناحية أخرى ، هو للإشارة إلى الأخطاء الجسيمة في بيئة تشغيل Java التي لا يجب أن تلتقطها التطبيقات. بعض الأمثلة هي: خطأ عدم وجود ذاكرة كافية و StackOverflowError.

التسلسل الهرمي للاستثناء

An استثناء مرة أخرى من نوعين: محدد وغير محدد. يجب معالجة الاستثناء المحدد بواسطة رمز الاتصال. يتم تنفيذ هذه القاعدة من قبل مترجم جافا. من ناحية أخرى ، يمكن نشر استثناء غير محدد في سلسلة المكالمات دون الحاجة إلى الإعلان عنه صراحة. ستوضح الأمثلة أدناه.

الاستثناءات المحددة

يحاول الأسلوب التالي إنشاء FileReader من ملف. يطرح المُنشئ استثناءًا محددًا FileNotFoundException التي يجب أن يتم التعامل معها من خلال رمز الاتصال أو أن يتم الإعلان عنها.

سوف الكود التالي ليس تجميع لأنها لا تفعل ذلك.

تحميل ملف فارغ خاص (اسم ملف السلسلة) {FileReader in = new FileReader (filename) ؛ }

تتمثل إحدى طرق الحصول على التعليمات البرمجية في الترجمة في معالجة الاستثناء (انظر أدناه).

تحميل ملف فارغ خاص (اسم ملف السلسلة) {try {FileReader in = new FileReader (filename)) ؛ {} catch (FileNotFoundException ex) {// مقبض الاستثناء هنا} }

إذا تعذر على المتصل معالجة الاستثناء مباشرة ، فيجب الإعلان عنه في توقيع الطريقة.

ملف فارغ خاص (ملف سلسلة) يطرح java.io. FileNotFoundException. {FileReader in = new FileReader (filename)) ؛ { }

استثناءات غير محددة

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

مقبض الفراغ الخاص {اسم السلسلة = فارغ ؛ إذا (name.length ()> 0) {} }

استثناءات الالتفاف

بالنظر إلى المناقشة أعلاه حول الاستثناءات المحددة وغير المحددة ، يبدو أنه من الأسهل التعامل مع الاستثناءات غير المحددة لأنه لا يتعين عليك إعلانها أو التعامل معها بنفسك. مع أخذ هذه الراحة في الاعتبار ، قد يكون من المفيد أحيانًا التفاف استثناء محدد في استثناء غير محدد.

يوضح المثال التالي من التعليمات البرمجية كيفية التفاف استثناء. طريقة طريقة 1() يلقي SQLException في جسمه. لكي يتم تجميع التعليمات البرمجية بشكل صحيح ، يجب التصريح عن الاستثناء.

يلقي method_1 () الفراغ الخاص SQLException {... رمي SQLException الجديد ؛ }

عندما يتم استدعاء هذه الطريقة من طريقة أخرى (الطريقة_2 ()) ، يمكن لهذه الطريقة التقاط SQLException ولفه داخل استثناء غير محدد ، لذلك ليس من الضروري الإعلان عن الاستثناء في توقيع أسلوبه.

طريقة الفراغ الخاصة_2 () {try {method_1 ()؛ } صيد (java.sql. SQLException ex) {إلقاء new RuntimeException (ex) ؛ } }

استثناء المكدس الاستثناء

يشير تتبع المكدس الاستثنائي إلى مصفوفة إطارات المكدس النشطة ، والتي يمثل كل منها استدعاء أسلوب ، تم التقاطه بواسطة JVM في الوقت الذي تم فيه طرح الاستثناء. يتضمن كل إطار مكدس موقع استدعاء الأسلوب بما في ذلك اسم الفئة واسم الطريقة وربما اسم ملف مصدر جافا ورقم السطر داخل الملف. من المفيد تتبع تسلسل المكالمات الذي تسبب في الخطأ استثناءات جافا: هل تتعامل معها بشكل صحيح؟يشير الاستثناء في البرمجة إلى حالة استثنائية في تنفيذ البرنامج. يتم استخدامه عندما يمكن معالجة الحالة بشكل أفضل في مكان آخر. خذ بعين الاعتبار الأمثلة التالية لمعالجة استثناء Java. اقرأ أكثر .

فيما يلي تتبع مكدس نموذجي ، تم الحصول عليه من كائن الاستثناء عندما تم التقاطه.

استثناء في الموضوع java.lang "الرئيسي". IndexOutOfBoundsException: الفهرس: 8 ، الحجم: 5 في java.util. ArrayList.rangeCheck (ArrayList.java: 653) على java.util. ArrayList.get (ArrayList.java: 429) في sample.sample1.main (sample1.java: 24)

الاستثناء هنا IndexOutOfBoundsException. يتضمن معلومات إضافية حول الخطأ. يحتوي تتبع التكديس على 3 إطارات تكديس ، يحتوي كل منها على معلومات الموقع كما هو موضح.

معالجة الاستثناءات

يمكن معالجة الاستثناء من خلال التقاطه في محاولة الصيد منع واتخاذ أي إجراء تصحيحي مطلوب. ال استثناء يوفر الكائن عدة طرق لاستخراج المعلومات حول الحالة التي تسببت فيه.

يسجّل الرمز التالي رسالة الخطأ إلى ملف سجل.

loadConfig () {try {// invoke code الخاص الذي قد يؤدي إلى إنشاء IOException} (java.io. IOException ex) {// مقبض الاستثناء هنا. يمكن تسجيل الدخول إلى ملف السجل. log.warning (ex.getMessage ()) ؛ } }

عند التفاف استثناء داخل آخر ، يمكنك استرداد الاستثناء الملتف:

سبب رمي = ex.getCause () ، log.warning ("السبب الأساسي:" + reason.getMessage ()) ؛ 

هل تحتاج إلى الوصول إلى تتبع المكدس ، وربما استخراج اسم الطريقة التي تسببت فيه؟

StringBuilder sbuf = جديد StringBuilder ("Stack Trace:")؛ لـ (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n")؛ } log.warning (sbuf.toString ()) ؛

أو ربما ، سجل الاستثناء وأعده؟

محاولة {... } صيد (java.io. IOException ex) {log.warning (ex.getMessage ()) ؛ رمي السابقين ؛ }

ال استثناء يوفر الفصل أ طباعة تتبع المكدس() الطريقة التي يمكنها طباعة تتبع المكدس بنفسك PrintStream (أو كاتب الطباعة).

محاولة {... } صيد (java.io. IOException ex) {PrintStream out = ...؛ out.println (ex.getMessage ()) ؛ ex.printStackTrace (خارج) ؛ }

يمكنك التقاط أنواع متعددة من الاستثناءات في واحد محاولة منع ، وتنفيذ معالجة محددة لكل نوع من الاستثناءات.

جرب {// يلقي ببعض الاستثناءات هنا. } صيد (java.io. IOException ex) {// معالجة خاصة بـ IOException هنا. } صيد (java.sql. SQLException ex) {// SQLException معالجة خاصة هنا. }

لالتقاط أنواع استثناء متعددة ولكن استخدام نفس رمز المعالجة ، يمكنك التصريح عن قبض على كتلة مع أنواع متعددة على النحو التالي:

جرب {// يلقي ببعض الاستثناءات هنا. } صيد (java.io. IOException | java.sql. SQLException ex) {// IOException و SQLException معالجة خاصة هنا. } التقاط (SAXException ex) {// SAXException معالجة خاصة هنا. }

تنظيف الموارد أخيرا

عند التعامل مع التعليمات البرمجية التي يمكن أن تؤدي إلى استثناءات ، من الضروري إجراء التنظيف المناسب لأي موارد ، مثل الملفات المفتوحة كل ما تحتاج لمعرفته حول تنسيقات الملفات وخصائصهانستخدم كلمة ملف بالتبادل: موسيقى ، صورة ، جدول بيانات ، عرض شرائح ، وما إلى ذلك. ولكن ما الذي يجعل الملف "ملفًا" على أي حال؟ دعونا نحاول أن نفهم هذا الجزء الأساسي من الحوسبة. اقرأ أكثر ، اتصالات قاعدة البيانات ، إلخ. يجب أن يتم تنظيف الموارد في أخيرا منع. بهذه الطريقة كل من الخروج العادي والخروج الاستثنائي من كتلة استدعاء رمز التنظيف أسوأ 10 أخطاء برمجة في التاريخفي ماضيها ، تم تدمير الترميز أيضًا. تسببت مثيلات القليل من التعليمات البرمجية السيئة في حدوث كارثة على مستوى رئيسي. فيما يلي 10 من أسوأ أخطاء البرمجة في التاريخ. اقرأ أكثر .

InputStream in = null؛ محاولة {... في = FileInputStream (اسم ملف) جديد ؛... } صيد (java.io. IOException ex) {log.warning (ex.getMessage ()) ؛ } أخيرًا يتم تنفيذ {// code هنا عند الخروج من block try ، // سواء بشكل طبيعي أو بسبب استثناء إذا (in! = null) in.close () ؛ }

كتلة المحاولة مع الموارد

قدم جافا 1.7 حاول مع الموارد بناء مما يجعل تنظيف الموارد أسهل. تبدو هكذا:

حاول (InputStream in = new FileInputStream (..)) {// الذي يستخدم InputStream. }

عندما يخرج الرمز من الكتلة (سواء بشكل نظيف أو بسبب استثناء) ، فإن تيار الإدخال يتم تنظيف المتغير تلقائيا.

تنظيف موارد متعددة من خلال التصريح عنها كلها في رأس الكتلة.

try (InputStream in = new FileInputStream (..)؛ يخدع الاتصال =... ؛ ) {// code الذي يستخدم InputStream والاتصال. }

أي كائن تطبق فئته قابل للإغلاق التلقائي يمكن تنظيف الواجهة بهذه الطريقة. يقوم الفصل التالي بإجراء بعض عمليات التنظيف المحددة في أغلق() طريقة.

فئة MyClass العامة تطبق AutoCloseable {public void close () {// cleanup code here} }

استخدم مثيل من هذه الفئة في حاول مع الموارد منع.

try (MyClass obj = new MyClass (..)) {// code الذي يستخدم كائن MyClass. }

بعض الاستثناءات الشائعة

دعونا الآن نلقي نظرة على بعض الاستثناءات الشائعة.

  • IndexOutOfBoundsException (غير محدد): يشير إلى أن فهرس العنصر الذي يتم الوصول إليه يقع خارج حدود المصفوفة أو السلسلة أو ما إلى ذلك.
  • SQLException (محدد): تم طرحه بسبب خطأ في قاعدة البيانات.
  • IOException (محدد): خطأ في الوصول إلى الملف أو أخطاء تتعلق بالإدخال والإخراج.
  • توقف المقاطعة (محددة): يتم طرحها عند مقاطعة تنفيذ مؤشر ترابط.
  • SAXException (محدد): تم طرحه بسبب أخطاء تحليل XML.
  • NullPointerException (لم يتم التحقق منه): استخدام فارغة حيث يكون الكائن مطلوبًا.

تغليف

الاستثناءات هي الطريقة الأساسية للإبلاغ عن الأخطاء وإدارتها في Java. الاستخدام المناسب للاستثناءات تحسين جودة التعليمات البرمجية اكتب أو اسرع التعليمات البرمجية في محرر نص Linux الخاص بك مع سمات مخصصةلا يجب أن يبدو محرر نصوص Linux الخاص بك باهتًا و "وظيفيًا". لماذا لا تقوم بتعديلها لتحسين إنتاجيتك ، سواء البرمجة النصية أو البرمجة أو استخدام الأداة كمحرر ترميز؟ اقرأ أكثر والمساعدة في حل قضايا الإنتاج.

هل لديك أي قصص حرب تتعلق بالاستثناءات؟ إذا كان الأمر كذلك ، فأخبرنا بذلك في قسم التعليقات أدناه.

حقوق الصورة: ديمتري نيكولايف عبر Shutterstock.com