أولاً ، أعط قطعة من الكود:
الفئة العامة aslistmethod {public static void main (string [] args) {String Sectence = "I Love You" ؛ قائمة <Tring> words = arrays.aslist (sentence.split ("")) ؛ لـ (int i = 0 ؛ i <words.size () ؛) {if (words.get (i) .equals ("love")) {words.remove (i) ؛ يكمل؛ } i ++ ؛ } system.out.println (Words) ؛ }ثم ، قم بتشغيل هذا الرمز ، وأخيراً ، تم الإبلاغ عن خطأ:
استثناء في الموضوع "الرئيسي" java.lang.unsupportedOperationException في java.util.abstractlist.remove (ustrignlist.java:161) في list.aslistmethod.main (aslistmethod.java:12)
الجزء السفلي من قائمة سلسلة الأخطاء. aslistmethod.main (aslistmethod.java:12) يدور حول هذا السطر من الكود:
Words.remove (i) ؛
جعلني هذا الخطأ مرتبكًا لأنني نظرت تقريبًا إلى هذا الرمز قبل كتابة هذا الرمز. طريقة Arrays.Aslist إرجاع قائمة ArrayList. لماذا لا يمكنني إزالته؟ بعد ذلك ، بسبب خطأ بسيط ، تم تعيين نتيجة المصفوفات. شعرت على الفور وكأنه قطة أعمى ضربت الماوس الميت. بعد ذلك ، اتبع طريقة Arrays.Aslist وابحث عن أن قائمة ArrayList هذه ليست هي نفس ArrayList. arrays.aslist إرجاع java.util.arrays.arraylist ، وهي مجرد فئة داخلية من المصفوفات. رمزه ليس طويلاً ، لذلك قمت بنشره مباشرة هنا:
arraylist الفئة الثابتة الخاصة <e> يمتد مجردة ript <e> الأدوات العشوائية ، java.io.serializable {private static final long serialversionuid = -2764017481108945198l ؛ النهائي الخاص e [] a ؛ ArrayList (e [] array) {a = objects.requirenonnull (Array) ؛ } Override public int size () {return A.Length ؛ } Override public object [] toarray () {return A.Clone () ؛ } OverRideSuppressWarnings ("unchected") عامة <T> t [] tararray (t [] a) {int size = size () ؛ if (A.Length <size) return arrays.copyof (this.a ، size ، (class <؟ extens t t []>) a.getClass ()) ؛ System.ArrayCopy (this.a ، 0 ، a ، 0 ، size) ؛ if (A.Length> size) a [size] = null ؛ إرجاع أ ؛ } Override public e get (int index) {return a [index] ؛ } Override public e set (int index ، e element) {e oldvalue = a [index] ؛ A [index] = element ؛ إرجاع Oldvalue ؛ } Override public int indexof (object o) {if (o == null) {for (int i = 0 ؛ i <a.length ؛ i ++) if (a [i] == null) return i ؛ } آخر {for (int i = 0 ؛ i <a.length ؛ i ++) if (o.equals (a [i])) return i ؛ } العودة -1 ؛ } Override Public Boolean يحتوي على (كائن O) {return indexof (o)! = -1 ؛ } Override public spliterator <e> spliterator () {return splitrators.spliterator (a ، spliterator.ordered) ؛ }} من الكود المصدري ، يرث من AbstractList ولا توجد طريقة إزالة ، لقد وجدت طريقة إزالة AbstractList:
Public e remove (int index) {refl new UnsupportedOperationException () ؛ } هذا هو المكان الذي تأتي منه رسالة الخطأ. أخيرًا ، نعلم أن ArrayList تم إرجاعه بواسطة Arrays.Aslist لا يدعم الإزالة. في الواقع ، java.util.arrays.arrayList لا يدعم أي شكل من أشكال إزالة العناصر.
خلاصة القول ، فإن حل هذه المشكلة يشبه إلى حد ما القطة الأعمى التي تضرب الماوس الميت ، ولكن طالما أنظر بعناية إلى الخطأ المبلغ عنه:
في java.util.abstractlist.remove (AbstractList.java:161)
يختلف استدعاء طريقة إزالة java.util.abstractlist عما كنت أتوقعه ، ويمكن أن يخبرني الاتجاه بوضوح.
آمل أن يكون هذا المقال مفيدًا للجميع لتعلم برمجة Java.