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

هل NoSuchElementException في Java هو نفسه كما IllegalStateException؟

عند تفعيل الطريقة في وقت غير قانوني أو غير مناسب، يتم إنشاء IllegalStateException.

على سبيل المثال، ستحذف طريقة remove() لفئة ArrayList العنصر الأخير بعد تفعيل طريقة next() أو Previous.

  • بعد حذف العنصر في الموضع الحالي، يجب عليك التحرك إلى العنصر التالي لحذفه، أي، يمكنك تفعيل طريقة remove() مرة واحدة فقط في كل مرة تفعيل طريقة next().

  • بسبب أن موقع البداية للقائمة (الإشارة) سيكون قبل العنصر الأول، لذا لا يمكنك تفعيل هذه الطريقة دون تفعيل الطريقة التالية.

إذا لم تفعّل طريقة remove()، فإنه سيُحدث java.lang.IllegalStateException.

مثال: تحريك إلىالرقمحذف عنصر قبل العنصر

import java.util.ArrayList;
import java.util.ListIterator;
public class NextElementExample{
   public static void main(String args[]) {
      //إنشاء عنصر ArrayList
      ArrayList<String> list = new ArrayList<String>();
      //ملء ArrayList
      list.add("التفاح");
      list.add("المانجو");
      //الحصول على عنصرIterator لArrayList
      ListIterator<String> it = list.listIterator();
      //تحريك العنصر إلى الموضع الأول
      it.remove();
   }
}

استثناء في الوقت

Exception in thread "main" java.lang.IllegalStateException
at java.util.ArrayList$Itr.remove(Unknown Source)
at MyPackage.NextElementExample.main(NextElementExample.java:17)

مثال: تفعيل طريقة next() مرة واحدة، ثم تفعيلها مرتين

import java.util.ArrayList;
import java.util.ListIterator;
public class NextElementExample{
   public static void main(String args[]) {
      //إنشاء عنصر ArrayList
      ArrayList<String> list = new ArrayList<String>();
      //ملء ArrayList
      list.add("التفاح");
      list.add("المانجو");
      //الحصول على عنصرIterator لArrayList
      ListIterator<String> it = list.listIterator();
      //تحريك العنصر إلى الموضع الأول
      it.next();
      it.remove();
      it.remove();
   }
}

نتيجة الخروج

Exception in thread "main" java.lang.IllegalStateException
   at java.util.ArrayList$Itr.remove(Unknown Source)
   at MyPackage.NextElementExample.main(NextElementExample.java:17)

في هذه الحالة، حاول أيضًا تفعيل هذه الطريقة في الدورات.

it.next();
while(it.hasNext()) {
   it.remove();
}

تحلل

في هذه الحالة، لتحل مشكلة IllegalStateException، يجب عليك تفعيل طريقة remove() بشكل صحيح (فقط مرة واحدة بعد تفعيل next())

مثال

import java.util.ArrayList;
import java.util.Arrays;
import java.util.ListIterator;
public class NextElementExample{
   public static void main(String args[]) {
      //إنشاء كائن ArrayList
      ArrayList<String> list = new ArrayList<String>();
      //ملء ArrayList
      list.add("التفاح");
      list.add("المانجو");
      //الحصول على كائن Iterator من ArrayList
      ListIterator<String> it = list.listIterator();
      //إزالة العنصر بدون الانتقال إلى الموقع الأول
      System.out.println(Arrays.toString(list.toArray()));
      while(it.hasNext()) {
         it.next();
         it.remove();
      }  
      System.out.println(Arrays.toString(list.toArray()));
   }
}

نتيجة الخروج

[التفاح، المانجو]
[]

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

NoSuchElementException

إذا حاولت الحصول على عنصر من كائن فارغ، أو استخدام طريقة الوصول لـ Enumeration، Iterator أو tokenizer (مثل next() أو nextElement()) لاستكشاف محتويات مجموعة، مصفوفة أو كائن آخر، فإن محاولة الحصول على العنصر التالي بعد وصولك إلى نهاية الكائن (المجموعة، المصفوفة أو الكائن الآخر) تؤدي إلى إنشاء NoSuchElementException.

على سبيل المثال،

  • إذا تم استدعاء طريقة nextElement() من كلاس Enumeration على كائن Enumeration فارغ، أو إذا كانت المواقع الحالية في نهاية Enumeration، فإن NoSuchElementException يتم إنشاؤه عند تشغيل الوقت.

  • إذا تم استدعاء طريقة nextElement() وnextToken() من كلاس StringTokenizer على كائن StringTokenizer فارغ، أو إذا كانت المواقع الحالية في نهاية StringTokenizer، فإنه يتم إنشاء NoSuchElementException عند تشغيل الوقت.

  • إذا تم استدعاء طريقة next() من فئة Iterator أو ListIterator على موضوع فارغ من Iterator / ListIterator، أو إذا كان الموقع الحالي في النهاية، فإن NoSuchElementException يتم إنشاؤه أثناء التشغيل.

  • إذا تم استدعاء طريقة previous() من فئة ListIterator على موضوع فارغ من فئة ListIterator، أو إذا كان الموقع الحالي هو البداية في ListIterator، فإن NoSuchElementException يتم إنشاؤه أثناء التشغيل.

مثال

لنفكر في مثال كامل لحالة واحدة

import java.util.StringTokenizer;
public class StringTokenizerExample{
   public static void main(String args[]) {
      String str = "Hello how are you";
      //إنشاء StringTokenizer class
      StringTokenizer tokenizer = new StringTokenizer(str, " ");
      //Printing all the tokens
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      //الحصول على التوقيت التالي بعد الوصول إلى النهاية
      tokenizer.nextToken();
      tokenizer.nextElement();
   }
}

خطأ في التشغيل

مرحبًا
كيف
كنت
أنت
Exception in thread "main" java.util.NoSuchElementException
   at java.util.StringTokenizer.nextToken(Unknown Source)
   at MyPackage.StringTokenizerExample.main(StringTokenizerExample.java:16)

تحلل

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

على سبيل المثال،

  • فئة Enumeration تحتوي على طريقة hasMoreElements()، إذا كان الموضوع يحتوي على مزيد من العناصر بعد الموقع الحالي، فإن هذه الطريقة تعود إلى true (إلا إذا كانت تعود إلى false).

  • فئة StringTokenizer تحتوي على طريقتي hasMoreTokens() وhasMoreElements()، إذا كان الموضوع يحتوي على مزيد من العناصر بعد الموقع الحالي، فإن هذه الطريقة تعود إلى true (إلا إذا كانت تعود إلى false).

  • فئة Iterator تحتوي على طريقة hasNext()، إذا كان الم迭代ر يحتوي على مزيد من العناصر بجانب الموقع الحالي، فإن هذه الطريقة تعود أيضًا إلى true (إلا إذا كانت تعود إلى false).

  • فئة ListIterator تحتوي على طريقة hasPrevious()، إذا كان الم迭代ر يحتوي على مزيد من العناصر قبل الموقع الحالي، فإن هذه الطريقة تعود أيضًا إلى true (إلا إذا كانت تعود إلى false).

مثال

import java.util.StringTokenizer;
public class StringTokenizerExample{
   public static void main(String args[]) {
      String str = "Hello how are you";
      //إنشاء StringTokenizer class
      StringTokenizer tokenizer = new StringTokenizer(str, " ");
      //Printing all the tokens
      while(tokenizer.hasMoreTokens()) {
         System.out.println(tokenizer.nextToken());
      }
   }
}

نتيجة الخروج

مرحبًا
كيف
كنت
أنت

الفرق

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

إذا حاولت الوصول إلى العناصر من Enumeration،Iterator،StringTokenizer وما إلى ذلك (باستخدام طرق الوصول)، سيتم إنشاء NoElementException عند عدم وجود عناصر أخرى.

سيجذبك هذا