Latest web development tutorials

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

الاستثناءات هي بعض الأخطاء في البرنامج، ولكن ليست كل الأخطاء هي استثناءات، وأحيانا أخطاء يمكن تجنبها.

على سبيل المثال، الشفرة أقل فاصلة منقوطة، ثم نفد من نتائج هو للمطالبة java.lang.Error الخطأ، وإذا كنت تستخدم System.out.println (11/0)، ثم تقومون به بسبب استخدام المقسوم عليه 0 سيتم طرح ذلك استثناء java.lang.ArithmeticException.

هناك أسباب كثيرة لحدوث استثناء، عادة ما تحتوي على الفئات التالية:

  • إدخال المستخدم البيانات غير قانوني.
  • لفتح ملف غير موجود.
  • اتصال شبكة الاتصال مقطوعا أو JVM تجاوز الذاكرة.

تسببت هذه الاستثناءات إما بسبب خطأ المستخدم تسبب بعض الأخطاء الإجرائية لأن هناك أخطاء المادية الأخرى. -

لفهم جافا معالجة الاستثناء هو كيف يعمل، تحتاج إلى أن يكون الأنواع الثلاثة التالية من الاستثناءات:

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

التسلسل الهرمي فئة استثناء

جميع الفئات باستثناء ترث من فئة فرعية java.lang.Exception.

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

برامج جافا عادة لا قبض على خطأ. يحدث الخطأ عادة عندما يكون خطأ خطيرا، فهي مرئية خارج تجهيز برنامج جافا.

خطأ بيئة وقت التشغيل المستخدمة للإشارة إلى خطأ يحدث.

على سبيل المثال، JVM ذاكرة تجاوز. بشكل عام، فإن البرنامج لا على التعافي من الخطأ.

الطبقة استثناء اثنين من أهم فئات فرعية: فئة IOException والطبقة RuntimeException.

المدمج في فئة جافا (سيتم شرح المقبل)، لديها أكثر من الشيكات العادية واستثناء دون رادع.


المدمج في الصف استثناء جافا

وتعرف لغة جافا عدة فئات استثناء في حزمة java.lang القياسية.

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

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

غير طبيعي وصف
ArithmeticException عندما تكون الشروط العملية غير طبيعية، ويتم طرح هذا الاستثناء. على سبيل المثال، "القسمة على صفر" صحيح ألقيت مثيل من هذه الفئة.
ArrayIndexOutOfBoundsException مع فهرس غير قانوني للوصول إلى مجموعة والقيت. إذا كان مؤشر سلبي أو أكبر من أو يساوي حجم المصفوفة، والمؤشر هو مؤشر غير قانوني.
ArrayStoreException في محاولة لتخزين نوع خاطئ من كائن إلى مجموعة من الاستثناءات القيت.
ClassCastException عند محاولة تحويل كائن ليس مثيل فئة فرعية ترتمي.
IllegalArgumentException القيت في إشارة إلى أنه قد تم تمرير طريقة حجة غير قانونية أو غير لائقة.
IllegalMonitorStateException القيت تشير إلى أن موضوع حاولت الانتظار على رصد كائن أو إخطار غيرها من الأشياء ينتظرون رصد موضوع دون مراقبة محددة.
IllegalStateException في حالة وجود وقت غير قانوني أو غير مناسب لاستدعاء أسلوب لتوليد إشارة. وبعبارة أخرى، فإن بيئة جافا أو تطبيق جافا ليست في حالة مناسبة للعملية المطلوبة.
IllegalThreadStateException الموضوع ليس في حالة مناسبة عندما العملية المطلوبة المطلوبة القيت.
IndexOutOfBoundsException لأنه يدل على مؤشر نوع (مثل الفرز مجموعة، سلسلة أو ناقلات) القيت خارج النطاق.
NegativeArraySizeException إذا حاول تطبيق لإنشاء صفيف مع حجم سلبي، ترتمي.
NullPointerException عندما يحاول تطبيق لاستخدام كائن في حاجة المحلي null عندما ترتمي
NumberFormatException عندما يحاول تطبيق لتحويل سلسلة إلى نوع عددي، إلا أن سلسلة لا يمكن تحويلها إلى الشكل المناسب، وزعته الوضع الشاذ.
SecurityException من قبل مدير الأمن يلقي استثناء، لأنه يدل على انتهاك الامن.
StringIndexOutOfBoundsException هذا الاستثناء من String يلقي طرق للإشارة إلى أن مؤشر إما سلبي أو أكبر من حجم السلسلة.
UnsupportedOperationException عندما لا يتم اعتماد ترتمي العملية المطلوبة.

يسرد الجدول التالي جافا المحددة في حزمة java.lang فحص الطبقات استثناء.

غير طبيعي وصف
ClassNotFoundException تطبيق يحاول تحميل الطبقة، لا يمكن العثور على الطبقة المقابلة ترتمي.
CloneNotSupportedException عند استدعاء Object من الدرجة clone طريقة لاستنساخ كائن، ولكن الطبقة الكائن لا يمكن تنفيذ Cloneable واجهة ترتمي.
IllegalAccessException عندما حرم من الحصول على فئة ترتمي.
InstantiationException عند محاولة استخدام Class الدرجة newInstance إنشاء مثيل من أسلوب فئة، فئة الكائن المعين لأنه هو واجهة أو فئة مجردة لا يمكن مثيل، وزعته الوضع الشاذ.
InterruptedException انقطع خيط من موضوع آخر، يتم طرح هذا الاستثناء.
NoSuchFieldException المتغير المطلوب غير موجود
NoSuchMethodException طريقة طلب غير موجود

شذوذ

القائمة التالية هي أسلوب فئة قابل للظهور الرئيسية:

لا. طريقة والوصف
1 جمهور سلسلة getMessage ()
بإرجاع معلومات مفصلة حول حدث الاستثناء. الأخبار تهيئة في منشئ فئة قابل للظهور.
2 الجمهور قابل للظهور getCause ()
بإرجاع كائن قابل للظهور الذي يمثل سبب الاستثناء.
3 toString سلسلة العامة ()
النتائج باستخدام getMessage () ترجع اسم فئة من تتالي.
4 printStackTrace باطلة العامة ()
toString الطباعة () نتيجة ومستوى كومة إلى System.err، وهي دفق إخراج الخطأ.
5 الجمهور StackTraceElement [] getStackTrace ()
تقوم بإرجاع مجموعة تحتوي على مستوى المكدس. 0 عنصر منخفض يمثل الجزء العلوي من كومة، يمثل العنصر الأخير استدعاء أسلوب كومة أسفل المكدس.
6 الجمهور قابل للظهور fillInStackTrace ()
وأضاف شغل في كومة كائن قابل للظهور مع المستوى الحالي من مستوى استدعاء مكدس إلى مستوى كومة من أي معلومات سابقة.

قبض على استثناء

استخدام محاولة ويمكن أن كلمات الصيد تصفية الاستثناء. حاول / كتلة الصيد في استثناءات المكان الذي قد يحدث.

ويسمى جملة كود حاول / كتلة التقاط رمز الحماية باستخدام حاول / المصيد هو على النحو التالي:

try
{
   // 程序代码
}catch(ExceptionName e1)
{
   //Catch 块
}

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

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

أمثلة

أعلنت المثال التالي صفيف عنصر اثنين، عندما يحاول رمز للوصول إلى العنصر الثالث من مجموعة متى رمي استثناء.

// 文件名 : ExcepTest.java
import java.io.*;
public class ExcepTest{

   public static void main(String args[]){
      try{
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

وترجمة التعليمات البرمجية أعلاه وتشغيل الإخراج التالي:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

كتل التقاط عدة

وتسمى تعدد كتل التعليمات البرمجية الصيد بعد كتلة التعليمات البرمجية في محاولة لمتابعة التقاط متعددة.

متعددة جملة كتلة الصيد هو على النحو التالي:

 try{
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }

التعليمات البرمجية المتكررة أعلاه على ثلاث كتل الصيد.

يمكنك إضافة أي عدد من الكتل الصيد وراء بيان المحاولة.

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

إذا كنت رمي ​​نوع البيانات عدم تطابق باستثناء ExceptionType1، حيث سيتم التقاطها.

إن لم يكن، وسوف يتم تحويلها إلى كتلة التقاط الثاني.

وهكذا، حتى يتم القبض على استثناء من أي الصيد أو كتلة.

أمثلة

يوضح هذا المثال كيفية استخدام المتعدد حاول / catch.

try
{
   file = new FileInputStream(fileName);
   x = (byte) file.read();
}catch(IOException i)
{
   i.printStackTrace();
   return -1;
}catch(FileNotFoundException f) //Not valid!
{
   f.printStackTrace();
   return -1;
}

يلقي كلمات / رمي:

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

يمكنك أيضا استخدام رمي الكلمة بطرح استثناء، سواء كان جديدا أو حديثا مثيل القبض.

يلقي إعلان الطريقة التالية استثناء RemoteException:

import java.io.*;
public class className
{
   public void deposit(double amount) throws RemoteException
   {
      // Method implementation
      throw new RemoteException();
   }
   //Remainder of class definition
}

يمكن تعريف طريقة لرمي استثناءات متعددة، مفصولة فاصلة بين استثناءات متعددة.

على سبيل المثال، يلقي إعلان الأسلوب التالي RemoteException وInsufficientFundsException:

import java.io.*;
public class className
{
   public void withdraw(double amount) throws RemoteException,
                              InsufficientFundsException
   {
       // Method implementation
   }
   //Remainder of class definition
}

الكلمة أخيرا

أخيرا يستخدم الكلمة لخلق كتل التعليمات البرمجية بعد كتلة التعليمات البرمجية في محاولة للأداء.

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

في كتلة وأخيرا، يمكنك تشغيل تنظيف أعقاب طبيعة نوع من إنهاء بيان.

أخيرا يبدو كتلة في كتلة التقاط وأخيرا، بناء الجملة كما يلي:

 try{
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }finally{
    // 程序代码
 }
 

أمثلة

 public class ExcepTest{

   public static void main(String args[]){
      int a[] = new int[2];
      try{
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      finally{
         a[0] = 6;
         System.out.println("First element value: " +a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}

الأمثلة المذكورة أعلاه جمعت النتائج على النحو التالي:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

لاحظ أن المسائل التالية:

  • الصيد لا يمكن أن توجد بشكل مستقل عن المحاولة.
  • في محاولة / عدم إضافة كتلة التقاط بعد المتطلبات الإلزامية في نهاية المطاف.
  • ليس بعد كتلة المحاولة الصيد لا لم تمنع في نهاية المطاف.
  • محاولة، وقبض، وأخيرا لا يمكن إضافة أي رمز بين الكتل.

استثناء مخصصة بيان

في جافا، يمكنك تخصيص استثناء. تحتاج إلى النقاط التالية لتذكر لكتابة فصول استثناء الخاصة بك.

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

يمكنك تحديد الدرجة استثناء الخاصة بك مثل هذا:

class MyException extends Exception{
}

يتم فحص فقط الطبقة استثناء ترث لإنشاء فئات استثناء الطبقات استثناء.

الطبقة InsufficientFundsException التالية هي فئة استثناء المعرفة من قبل المستخدم الذي يرث من استثناء.

فئة استثناء وأي فئات أخرى، تحتوي على المتغيرات والأساليب.

أمثلة

// 文件名InsufficientFundsException.java
import java.io.*;

public class InsufficientFundsException extends Exception
{
   private double amount;
   public InsufficientFundsException(double amount)
   {
      this.amount = amount;
   } 
   public double getAmount()
   {
      return amount;
   }
}

لشرح كيفية استخدام طبقتنا استثناء مخصصة،

في فئة CheckingAccount التالية يحتوي على طريقة سحب () يطرح InsufficientFundsException استثناء.

// 文件名称 CheckingAccount.java
import java.io.*;

public class CheckingAccount
{
   private double balance;
   private int number;
   public CheckingAccount(int number)
   {
      this.number = number;
   }
   public void deposit(double amount)
   {
      balance += amount;
   }
   public void withdraw(double amount) throws
                              InsufficientFundsException
   {
      if(amount <= balance)
      {
         balance -= amount;
      }
      else
      {
         double needs = amount - balance;
         throw new InsufficientFundsException(needs);
      }
   }
   public double getBalance()
   {
      return balance;
   }
   public int getNumber()
   {
      return number;
   }
}

يوضح البرنامج التالي كيفية استدعاء إيداع الطبقة BankDemo CheckingAccount () والانسحاب طريقة ().

//文件名称 BankDemo.java
public class BankDemo
{
   public static void main(String [] args)
   {
      CheckingAccount c = new CheckingAccount(101);
      System.out.println("Depositing $500...");
      c.deposit(500.00);
      try
      {
         System.out.println("\nWithdrawing $100...");
         c.withdraw(100.00);
         System.out.println("\nWithdrawing $600...");
         c.withdraw(600.00);
      }catch(InsufficientFundsException e)
      {
         System.out.println("Sorry, but you are short $"
                                  + e.getAmount());
         e.printStackTrace();
      }
    }
}

ترجمة الملفات الثلاثة المذكورة أعلاه، وتشغيل BankDemo البرنامج، الحصول على النتائج على النحو التالي:

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
        at CheckingAccount.withdraw(CheckingAccount.java:25)
        at BankDemo.main(BankDemo.java:13)

استثناء عام

ويعرف نوعين من الاستثناءات وأخطاء في جافا.

  • JVM (آلة جافا الافتراضية) استثناء: استثناء القيت من قبل JVM أو أخطاء. على سبيل المثال: فئة NullPointerException، والطبقة ArrayIndexOutOfBoundsException، والطبقة ClassCastException.
  • استثناء على مستوى البرامج: برنامج API من قبل برنامج أو القيت. على سبيل المثال الدرجة IllegalArgumentException، والطبقة IllegalStateException.