English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدرس، سنتعلم عن طريق الأمثلة كيفية استخدام جملة التأكيد في Java (التأكيد في Java).
يستخدم التأكيد في Java لتحديد الكود الذي نعتقد أنه صحيح لتحديد الأخطاء.
استخدام كلمة المفتاح assert لتحقيق التأكيد.
وفيها نستخدم كلمة المفتاح assert.
assert condition;
هنا condition هو تعبير بولي، ونفترض أنه صحيح عند تنفيذ البرنامج.
بافتراض الافتراضي، يتم تعطيل التأكيد في وقت التنفيذ ويتم تجاهله.
لتمكين التأكيد، نستخدم:
java -ea:arguments
أو
java -enableassertions:arguments
إذا كان التأكيد مفعلاً والشروط صحيحة، فإن البرنامج سيقوم بالتنفيذ بشكل طبيعي.
لكن، إذا تم حساب الشروط عند تشغيل التأكيد كـfalse، فإن JVM ستقوم بإطلاق خطأ التأكيد، وسيوقف البرنامج فورًا.
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length == 2; System.out.println("هذا الأسبوع يحتوي على " + weekends.length + " عطلة نهاية الأسبوع"); {} {}
نتائج الخروج
هناك 3 عطلة نهاية الأسبوع في هذا الأسبوع
نحصل على النتيجة السابقة لأن البرنامج لا يحتوي على أخطاء في التجميع، ويتم تعطيل التأكد بشكل افتراضي.
بعد تمكين التأكد، نحصل على النتيجة التالية:
استثناء في thread "main" java.lang.AssertionError
assert condition : expression;
في شكل جملة التأكد هذا، يتم نقل التعبير إلى بناء محول AssertionError. إذا كان الشرط خطأ، يتم عرض قيمة التعبير كتفاصيل خطأ.
يستخدم الرسالة التفصيلية لالتقاط نقل معلومات فشل التأكد لمساعدة في تصحيح المشاكل.
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length==2 : "هناك فقط 2 عطلة نهاية الأسبوع في الأسبوع"; System.out.println("هناك " + weekends.length + " عطلة نهاية الأسبوع في الأسبوع"); {} {}
نتائج الخروج
استثناء في thread "main" java.lang.AssertionError: هناك فقط 2 عطلة نهاية الأسبوع في الأسبوع
من المثال أعلاه يمكن رؤية أن التعبير يتم نقلته إلى بناء محول AssertionError. إذا كانت افتراضاتنا صحيحة false، وتم تمكين التأكد، فإنه يتم إطلاق استثناء وعرض رسالة مناسبة.
هذه الرسالة تساعد في التشخيص وإصلاح الأخطاء التي تؤدي إلى فشل التأكد.
إذا لم نقدم أي معلمات لمفتاح سطر التأكد،
java -ea
سيتم تمكين التأكد في جميع الفئات باستثناء الفئات النظامية.
يمكننا أيضًا استخدام المعلمات لتأكيد الفئة والمجموعة المحددة. يمكن تقديم المعلمات التالية للوحدات المقدمة إلى هذه مفاتيح السطر
تمكين التأكد في اسم الفئة
لتمكين التأكد في جميع الفئات في البرنامج Main،
java -ea Main
تمكين فئة واحدة فقط
java -ea:AnimalClass Main
هذا يسمح باستخدام التأكد فقط في فئة AnimalClass في البرنامج الرئيسي.
تمكين التأكد في اسم المجموعة
لتمكين التأكد في المجموعة com.animal وأكوانها الفرعية
java -ea:com.animal... Main
在未命名的包中启用断言
在当前工作目录中的未命名包中启用断言(当我们不使用package语句时)。
java -ea:... Main
在系统类中启用断言
为了在系统类中启用断言,我们使用不同的命令行开关:
java -esa:arguments
或
java -enablesystemassertions:arguments
可以提供给这些开关的参数是相同的。
要禁用断言,我们使用:
java -da arguments
或
java -disableassertions arguments
要在系统类中禁用断言,我们使用:
java -dsa:arguments
或
java -disablesystemassertions:arguments
禁用断言时可以传递的参数与启用断言时相同。
快速高效地检测和纠正错误。
断言检查仅在开发和测试期间进行。它们会在运行时自动在生产代码中删除,因此不会减慢程序的执行速度。
它有助于删除样板代码并使代码更具可读性。
重构和优化代码,以增强其正确运行的信心。
无法访问的代码是我们尝试运行该程序时不会执行的代码。使用断言来确保无法访问的代码实际上是无法访问的。
让我们举个实例。
void unreachableCodeMethod() { System.out.println("Reachable code"); return; // Unreachable code System.out.println("Unreachable code"); assert false; {}
让我们再来看一个没有默认情况的switch语句示例。
switch (dayOfWeek) { case "Sunday": System.out.println("It’s Sunday!"); break; case "Monday": System.out.println("It’s Monday!"); break; case "Tuesday": System.out.println("It’s Tuesday!"); break; case "Wednesday": System.out.println("It’s Wednesday!"); break; case "Thursday": System.out.println("It’s Thursday!"); break; case "Friday": System.out.println("It’s Friday!"); break; case "Saturday": System.out.println("It’s Saturday!"); break; {}
يوضح جملة switch أعلاه أن أيام الأسبوع يجب أن تكون واحدة من هذه القيم السبعة. عدم وجود حالة افتراضية يعني أن المبرمج يؤمن بأن أحد هذه الحالات سيتم تنفيذها دائمًا.
لكن، قد لم يتم النظر في بعض الحالات في بعض الافتراضات الخطأ.
ينبغي استخدام التحقق لفحص هذا الافتراض لضمان عدم وصول إلى حالة switch الافتراضية.
default: assert false: dayofWeek + " is invalid day";
إذا كانت قيمة dayOfWeek ليست تاريخًا صالحًا، ألقي AssertionError.
لإ记录 افتراضاته الأساسية، يستخدم العديد من المبرمجين التعليقات. لنأخذ مثالاً على ذلك.
else { ... else { // نعرف أن (i % 2 == 1) ... {}
استخدم التحقق بدلاً من ذلك.
مع نمو البرنامج، قد تصبح التعليقات قديمة ومتباينة. ولكن، سنضطر إلى تحديث جمل التحقق؛ وإلا، قد تفشل أيضًا بسبب الشروط الصحيحة.
else { ... } assert i % 2 == 1 : i; ... {}
يمكن للمستخدم تقديم معلمات في الطريقة العامة.
لذلك، إذا تم استخدام التحقق لفحص هذه المعلمات، قد تفشل الشروط وتؤدي إلى AssertionError.
من الأفضل أن يسبب التحقق استثناءات تشغيلية مناسبة وأن يتم التعامل مع هذه الاستثناءات بدلاً من ذلك.
لا تدعو إلى إجراءات قد تؤثر على تشغيل البرنامج تحت ظروف التحقق.
لنأخذ مثالاً على جدول، يحتوي قائمة weekdays على أسماء أيام الأسبوع.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")); ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Sunday", "Saturday")); assert weekdays.removeAll(weekends);
في هذا السياق، نحاول حذف العناصر Saturday وSunday من ArrayList weekdays.
إذا تم تفعيل التحقق، يمكن للبرنامج تشغيله بشكل صحيح. ولكن، إذا تم تعطيل التحقق، لن يتم حذف العناصر من القائمة. قد يؤدي ذلك إلى فشل البرنامج.
بدلاً من ذلك، قم بتخصيص النتيجة إلى متغير، ثم استخدم هذا المتغير للإقرار.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")); ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Sunday", "Saturday")); boolean weekendsRemoved = weekdays.removeAll(weekends); assert weekendsRemoved;
بهذا، يمكننا التأكد من إزالة جميع الأيام العطلية من weekdays، دون النظر في تشغيل أو إيقاف الإقرارات. نتيجة لذلك، لن يؤثر ذلك على العمليات البرمجية المستقبلية.