ก่อนอื่นให้โค้ด:
คลาสสาธารณะ aslistmethod {โมฆะคงที่สาธารณะหลัก (String [] args) {String sentence = "I Love You"; รายการ <string> words = array.aslist (sentence.split ("")); สำหรับ (int i = 0; i <words.size ();) {ถ้า (words.get (i) .equals ("love")) {words.remove (i); ดำเนินการต่อ; } i ++; } system.out.println (คำ); -จากนั้นเรียกใช้รหัสนี้และในที่สุดก็มีการรายงานข้อผิดพลาด:
ข้อยกเว้นในด้าย "หลัก" java.lang.unsupportedoperationexception ที่ java.util.abstractlist.remove (Abstractlist.java:161) ที่ list.aslistmethod.main (aslistmethod.java:12)
ด้านล่างของรายการห่วงโซ่ข้อผิดพลาด aslistmethod.main (aslistmethod.java:12) เป็นเรื่องเกี่ยวกับบรรทัดของรหัสนี้:
Words.remove (i);
ข้อผิดพลาดนี้ทำให้ฉันสับสนเพราะฉันดูรหัสนี้ก่อนที่จะเขียนรหัสนี้ วิธีการอาร์เรย์ ASLIST ส่งคืน ArrayList ทำไมฉันไม่สามารถลบได้? ถัดไปเนื่องจากความผิดพลาดเล็กน้อยผลลัพธ์ของอาร์เรย์ ASLIST ได้รับมอบหมายให้ java.util.arrayList แต่การมอบหมายล้มเหลว ฉันรู้สึกเหมือนแมวตาบอดโจมตีเมาส์ที่ตายแล้วทันที จากนั้นทำตามวิธีการอาร์เรย์ ASLIST และพบว่า ArrayList นี้ไม่ได้เป็น ArrayList เดียวกัน arrays.aslist ส่งคืน java.util.array.arraylist ซึ่งเป็นเพียงชั้นเรียนภายในของอาร์เรย์ รหัสของมันไม่นานดังนั้นฉันจึงโพสต์โดยตรงที่นี่:
arraylist คลาสคงที่ส่วนตัว <e> ขยายบทคัดย่อ <e> ใช้แบบสุ่ม, java.io.serializable {ส่วนตัวคงที่สุดท้ายสุดท้าย serialversionuid = -2764017481108945198L; ส่วนตัวสุดท้าย E [] A; arrayList (e [] array) {a = objects.requirenonnull (อาร์เรย์); } @Override ขนาด int สาธารณะ () {return a.length; } @Override วัตถุสาธารณะ [] toarray () {return a.clone (); } @Override @suppresswarnings ("ไม่ได้ตรวจสอบ") สาธารณะ <t> t [] toarray (t [] a) {ขนาด int = size (); if (A.Length <size) return array.copyof (this.a, size, (class <? ขยาย t []>) a.getClass ()); System.arrayCopy (this.a, 0, a, 0, ขนาด); if (A.Length> ขนาด) a [size] = null; กลับ A; } @Override สาธารณะ e รับ (ดัชนี int) {ส่งคืน [ดัชนี]; } @Override Public E Set (INT INDEX, E Element) {e oldValue = a [ดัชนี]; A [ดัชนี] = องค์ประกอบ; กลับ OldValue; } @Override public int indexof (Object o) {ถ้า (o == null) {สำหรับ (int i = 0; i <a.length; i ++) ถ้า (a [i] == null) return i; } else {สำหรับ (int i = 0; i <a.length; i ++) ถ้า (o.equals (a [i])) return i; } return -1; } @Override บูลีนสาธารณะประกอบด้วย (Object O) {return indexof (o)! = -1; } @Override Public Spliterator <E> spliterator () {return spliterators.spliterator (a, spliterator.ordered); - จากซอร์สโค้ดมันสืบทอดมาจาก AbstractList และไม่มีวิธีการลบฉันพบวิธีการลบของ AbstractList:
สาธารณะ e ลบ (ดัชนี int) {โยน unsupportedoperationException ใหม่ (); - นี่คือที่มาของข้อความแสดงข้อผิดพลาด ในที่สุดเราก็รู้ว่า ArrayList ที่ส่งคืนโดย Arrays.aslist ไม่รองรับการลบ ในความเป็นจริง java.util.arrays.arraylist ไม่สนับสนุนการกำจัดองค์ประกอบในรูปแบบใด ๆ
โดยสรุปแล้วการแก้ปัญหานี้เป็นเหมือนแมวตาบอดที่ตีเมาส์ที่ตายแล้ว แต่ตราบใดที่ฉันดูข้อผิดพลาดอย่างระมัดระวัง:
ที่ java.util.abstractlist.remove (Abstractlist.java:161)
การเรียกใช้วิธีการลบของ java.util.abstractlist แตกต่างจากที่ฉันคาดไว้และมันสามารถบอกทิศทางได้อย่างชัดเจน
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนในการเรียนรู้การเขียนโปรแกรม Java