سؤال

هل يمكن لأي منكم شرح الاختلافات بين throw, throws و Throwable ومتى تستخدم أي؟

هل كانت مفيدة؟

المحلول

  • throws: يستخدم عند كتابة أساليب ، لإعلان أن الطريقة المعنية ترمي الاستثناء المحدد (المحدد).

    على عكس الاستثناءات التي تم فحصها ، قد يتم إلقاء استثناءات وقت التشغيل (NullPointerExceptions وما إلى ذلك) دون إعلان الطريقة throws NullPointerException.

  • throw: تعليمات لرمي الاستثناء بالفعل. (أو بشكل أكثر تحديدا ، رمي).

    يتبع الكلمة الرئيسية رمي إشارة إلى Throwable (عادة استثناء).

مثال:

enter image description here


  • Throwable: فئة يجب أن تمددها من أجل إنشاء خاص بك ، مخصصة ، يمكن رميها.

مثال:

enter image description here


نصائح أخرى

  • throw: بيان لرمي الأشياء t أين t instanceof java.lang.Throwable يجب أن يكون صحيحا.
  • throws: رمز توقيع الأسلوب لتحديد استثناءات محددة throwن بهذه الطريقة.
  • java.lang.Throwable: النوع الأصل لجميع الكائنات التي يمكن إلقاؤها (واشتعلت).

انظر هنا للحصول على برنامج تعليمي حول استخدام الاستثناءات.

هذا سهل الفهم حقًا.

ال java.lang.Throwable:

ال Throwable الفصل هو الفئة الفائقة لجميع الأخطاء والاستثناءات في لغة جافا. يتم إلقاء الكائنات فقط التي هي مثيلات من هذه الفئة (أو واحدة من فئاتها الفرعية) بواسطة الجهاز الظاهري Java أو يمكن إلقاؤها بواسطة Java throw بيان. وبالمثل ، يمكن أن يكون هذا الفئة فقط أو أحد فئاته الفرعية هو نوع الوسيطة في أ catch بند. أكثر

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

الكلمة الرئيسية يرمي يستخدم لرمي كائن هو مثيل من فئة قابلة للرسمية.


خشية أن ترى بعض الأمثلة:

نخلق أنفسنا فئة استثناء

public class MyException super Exception {

}

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

private  void throwMeAException() throws MyException //We inform that this method throws an exception of MyException class
{
  Exception e = new MyException (); //We create an exception 

  if(true) {
    throw e; //We throw an exception 
  } 
}

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

الخيار الأول هو استخدام Block Try and Catch للتعامل مع الاستثناء:

private void catchException() {

   try {
     throwMeAException();
   }
   catch(MyException e) {
     // Here we can serve only those exception that are instance of MyException
   }
}

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

   private void passException() throws MyException {

       throwMeAException(); // we call the method but as we throws same exception we don't need try catch block.

   }

الخيارات الثالثة هي التقاط الاستثناء وإعادة التوجيه

private void catchException() throws Exception  {

   try {
     throwMeAException();
   }
   catch(Exception e) {
      throw e;
   }
}

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

استثناء هذه القاعدة java.lang.RuntimeException هؤلاء لا يجب إعلانه. هذه قصة أخرى مثل جانب الاستثناء.

رمي - يتم استخدامه لرمي استثناء. يتطلب بيان الرمي وسيطة واحدة: كائن فئة قابلة للرمي

رميات - يتم استخدام هذا لتحديد أن الطريقة يمكن أن ترمي استثناء

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

Throw يستخدم لإلقاء الاستثناء ، throws (إذا خمنت بشكل صحيح) تم استخدامه للإشارة إلى أن الطريقة يمكن أن ترمي استثناء معين ، و Throwable الفصل هو الفئة الفائقة لجميع الأخطاء والاستثناءات في جافا

كيف ترمي الاستثناءات

يرمي :

يستخدم لرمي الاستثناء فعليًا ، في حين أن العلبات تعريفة للطريقة. أنها ليست قابلة للتبديل.

throw new MyException("Exception!);

رميات:

يجب استخدام هذا عندما لا تستخدم عبارة Try Catch في التعليمات البرمجية الخاصة بك ولكنك تعلم أن هذه الفئة المعينة قادرة على رمي ذلك واستثناء (استثناءات محددة فقط). في هذا ، لا تستخدم Try Catch Block ولكن اكتب باستخدام شرط الرمي عند النقطة المناسبة في الكود الخاص بك ويتم إلقاء الاستثناء على المتصل بالطريقة ويتم التعامل معه. كما يتم استخدام الكلمة الرئيسية رميات عندما تتمكن الوظيفة من رمي استثناء محدد.

public void myMethod(int param) throws MyException 

هناك نوعان رئيسيان من الاستثناءات:
استثناءات وقت التشغيل (لم يتم التحقق منها): على سبيل المثال. NullPointerException ، classcastexception ، ..
استثناءات فحص: على سبيل المثال. FileNotfoundException ، clonenotsupportedException ، ..

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

public Rational(int num, int denom){
if(denom <= 0) {
  throw new IllegalArgumentException("Denominator must be positive");
}
this.num=num;
this.denom=denom;
}

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

Class Employee{
public Employee clone() throws CloneNotSupportedException{
    Employee copy = (Employee)super.clone();
    copy.hireDate = (Date)hireDate.clone();
    return copy;
}
}

نفس الإجابة على النحو الوارد أعلاه ولكن مع نسخ الملصق:

public class GsonBuilderHelper {
    // THROWS: method throws the specified (checked) exception
    public static Object registerAndRun(String json) throws Exception {

        // registering of the NaturalDeserializer
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());
        Gson gson = gsonBuilder.create();

        Object natural = null;
        try {
            // calling the NaturalDeserializer
            natural = gson.fromJson(json, Object.class);
        } catch (Exception e) {
            // json formatting exception mainly
            Log.d("GsonBuilderHelper", "registerAndRun(json) error: " + e.toString());
            throw new Exception(e);  // <---- THROW: instance of class Throwable. 
        }
        return natural;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top