سؤال

هذا السؤال لديه بالفعل إجابة هنا:

ماذا فعلت assert فعل؟ على سبيل المثال في الوظيفة:

private static int charAt(String s, int d) {
    assert d >= 0 && d <= s.length();
    if (d == s.length()) return -1;
    return s.charAt(d);
}
هل كانت مفيدة؟

المحلول

إذا قمت بتشغيل برنامجك مع -enableassertions (أو -ea لفترة قصيرة) ثم هذا البيان

assert cond;

يعادل

if (!cond)
    throw new AssertionError();

إذا قمت بتشغيل برنامجك بدون هذا الخيار ، فلن يكون لبيان Assert أي تأثير.

فمثلا، assert d >= 0 && d <= s.length();, ، كما تم نشره في سؤالك ، يعادل

if (!(d >= 0 && d <= s.length()))
    throw new AssertionError();

(إذا كنت قد أطلقت مع -enableassertions هذا هو.)


رسميا ، و مواصفات لغة جافا: 14.10. ال assert بيان - تصريح يقول ما يلي:

14.10. ال assert بيان - تصريح
التأكيد هو assert بيان يحتوي على تعبير منطقي. التأكيد هو إما تمكين أو تعطيل. إذا تم تمكين التأكيد ، فإن تنفيذ التأكيد يتسبب في تقييم التعبير المنطقي و تم الإبلاغ عن خطأ إذا كان التعبير يقيم false. إذا تم تعطيل التأكيد ، فإن تنفيذ التأكيد ليس له أي تأثير على الإطلاق.

أين "تمكين أو تعطيل" يتم التحكم فيه مع -ea التبديل و "تم الإبلاغ عن خطأ" يعني أن AssertionError هذا خطئ.


وأخيرا ، ميزة أقل شهرة من assert:

يمكنك إلحاق : "Error message" مثله:

assert d != null : "d is null";

لتحديد رسالة الخطأ التي يجب أن تكون عليها تأكيد التأكيد.


تمت إعادة كتابة هذا المنشور كمقال هنا.

نصائح أخرى

إذا لم تكن الحالة راضية ، AssertionError سيتم إلقاؤه.

يجب تمكين التأكيدات ، على الرغم من ؛ وإلا فإن assert التعبير لا يفعل شيئًا. نرى:

http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable

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

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

اجعل الأمر بسيطًا جدًا لفهم:

عندما يكون لديك موقف مماثل مثل هذا:

    String strA = null;
    String strB = null;
    if (2 > 1){
        strA = "Hello World";
    }

    strB = strA.toLowerCase(); 

قد تتلقى تحذيرًا (عرض الخط الأصفر على strb = stra.toLowercase () ؛) التي قد تنتج شترا قيمة فارغة إلى STRB. على الرغم من أنك تعلم أن STRB لن يكون فارغًا على الإطلاق

1. تعطيل التحذير.

2. قم برمي خطأ الاستثناء في حالة حدوث أسوأ شيء (عند تشغيل التطبيق الخاص بك).

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

لذا ، إذا وضعت تأكيدًا ، مثل هذا:

    assert strA != null; //Adding here
    strB = strA .toLowerCase();

أنت تخبر المترجم أن شترا ليس على الإطلاق قيمة فارغة ، يمكن أن "بسلام" إيقاف التحذير. إذا كان NULL (يحدث أسوأ حالة) ، فسيوقف التطبيق ويرمي خطأً لك لتحديد موقعه.

استخدم هذا الإصدار من عبارة Assert لتوفير رسالة تفصيلية للتأكيد. يمرر النظام قيمة Expression2 إلى مُنشئ التأكيد المناسب ، والذي يستخدم تمثيل السلسلة للقيمة كرسالة تفاصيل الخطأ.

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

جافادوك

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

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

إنه يضمن أن التعبير يعود صحيحًا. خلاف ذلك ، فإنه يرمي أ java.lang.AssertionError.

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10

يؤكد هذا التأكيد إذا قمت بتشغيل التطبيق الخاص بك مع تشغيل التأكيدات.

int a = 42;
assert a >= 0 && d <= 10;

إذا قمت بتشغيل هذا مع ، قل: Java -ea -jar Peiska.jar

يجب أن يرمي java.lang.assertionerror

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top