English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
عند تفعيل الطريقة في وقت غير قانوني أو غير مناسب، يتم إنشاء 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)
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())); } }
نتيجة الخروج
[التفاح، المانجو] []
بالمثل، في كل حالة يجب معالجة استثناءات الحالة غير الصحيحة، تحتاج إلى استدعاء الطريقة التي تؤدي إلى الاستثناء في موقعه الصحيح.
إذا حاولت الحصول على عنصر من كائن فارغ، أو استخدام طريقة الوصول لـ 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 عند عدم وجود عناصر أخرى.