English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليميات Java الأساسية

Java التحكم في العملية

Java مجموعة

Java توجيهي (I)

Java توجيهي (II)

Java توجيهي (III)

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

Java مجموعة List

Java مجموعة Queue (الطابور)

Java مجموعة Map

Java مجموعة Set

Java إدخال/إخراج (I/O)

Java Reader/Writer

مواضيع أخرى في Java

الاستدلال (Assert) Java

في هذا الدرس، سنتعلم عن طريق الأمثلة كيفية استخدام جملة التأكيد في Java (التأكيد في Java).

يستخدم التأكيد في Java لتحديد الكود الذي نعتقد أنه صحيح لتحديد الأخطاء.

استخدام كلمة المفتاح assert لتحقيق التأكيد.

وفيها نستخدم كلمة المفتاح assert.

assert condition;

هنا condition هو تعبير بولي، ونفترض أنه صحيح عند تنفيذ البرنامج.

تمكين التأكيد

بافتراض الافتراضي، يتم تعطيل التأكيد في وقت التنفيذ ويتم تجاهله.

لتمكين التأكيد، نستخدم:

java -ea:arguments

أو

java -enableassertions:arguments

إذا كان التأكيد مفعلاً والشروط صحيحة، فإن البرنامج سيقوم بالتنفيذ بشكل طبيعي.

لكن، إذا تم حساب الشروط عند تشغيل التأكيد كـfalse، فإن JVM ستقوم بإطلاق خطأ التأكيد، وسيوقف البرنامج فورًا.

مثال 1: Java التأكيد

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. إذا كان الشرط خطأ، يتم عرض قيمة التعبير كتفاصيل خطأ.

يستخدم الرسالة التفصيلية لالتقاط نقل معلومات فشل التأكد لمساعدة في تصحيح المشاكل.

مثال 2: مثال Java على التأكد بوجود تعبير

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

禁用断言时可以传递的参数与启用断言时相同。

断言的优点

  1. 快速高效地检测和纠正错误。

  2. 断言检查仅在开发和测试期间进行。它们会在运行时自动在生产代码中删除,因此不会减慢程序的执行速度。

  3. 它有助于删除样板代码并使代码更具可读性。

  4. 重构和优化代码,以增强其正确运行的信心。

何时使用断言

1.无法访问的代码

无法访问的代码是我们尝试运行该程序时不会执行的代码。使用断言来确保无法访问的代码实际上是无法访问的。

让我们举个实例。

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.

2. تسجيل الافتراضات

لإ记录 افتراضاته الأساسية، يستخدم العديد من المبرمجين التعليقات. لنأخذ مثالاً على ذلك.

else {
    ...
else { // نعرف أن (i % 2 == 1)
    ...
{}

استخدم التحقق بدلاً من ذلك.

مع نمو البرنامج، قد تصبح التعليقات قديمة ومتباينة. ولكن، سنضطر إلى تحديث جمل التحقق؛ وإلا، قد تفشل أيضًا بسبب الشروط الصحيحة.

else {
   ...
}
    assert i % 2 == 1 : i;
    ...
{}

متى لا تستخدم التحقق

1. فحص المعلمات في الطريقة العامة

يمكن للمستخدم تقديم معلمات في الطريقة العامة.

لذلك، إذا تم استخدام التحقق لفحص هذه المعلمات، قد تفشل الشروط وتؤدي إلى AssertionError.

من الأفضل أن يسبب التحقق استثناءات تشغيلية مناسبة وأن يتم التعامل مع هذه الاستثناءات بدلاً من ذلك.

2. حساب التعبيرات التي تؤثر على تشغيل البرنامج

لا تدعو إلى إجراءات قد تؤثر على تشغيل البرنامج تحت ظروف التحقق.

لنأخذ مثالاً على جدول، يحتوي قائمة 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، دون النظر في تشغيل أو إيقاف الإقرارات. نتيجة لذلك، لن يؤثر ذلك على العمليات البرمجية المستقبلية.