Container.remove (كثافة العمليات ط) يلقي ArrayIndexOutOfBoundsException غير متوقع

StackOverflow https://stackoverflow.com/questions/1419745

  •  07-07-2019
  •  | 
  •  

سؤال

وأنا أحاول إزالة كافة ولكن المكون الطفل الأول من حاوية جافا. سجلات البرمجية التالية "هناك 3" ويطرح ArrayIndexOutOfBoundsException: مؤشر صفيف خارج النطاق: 2

int componentCount = cardPanel.getComponentCount();
logger.info("There are " + componentCount);
for (int i = 1; i < componentCount; i++) {
    cardPanel.remove(i);
}

ولكن، هذه نسخة معدلة يعمل تماما:

Component[] components = cardPanel.getComponents();
logger.info("There are " + components.length);
for (int i = 1; i < components.length; i++) {
    cardPanel.remove(components[i]);
}

ويبدو أن Container.getComponentCount () وContainer.remove (كثافة العمليات ط) لا يمكن أن نوافق على عدد من المكونات في الحاوية. وقد أي شخص آخر واجهت هذه المشكلة؟

هل كانت مفيدة؟

المحلول

عند تفعلونه cardPanel.remove (ط)، وعدد من المكونات هو الحد.

وهكذا يكون لديك [0، 1، 2]، وإزالة البند في مؤشر 1.
الآن لديك [0، 2] وإزالة العنصر في الفهرس 2، والذي يلقي ArrayIndexOutOfBoundsException.

والنسخة المعدلة يعمل لأنه إزالة الكائن الفعلي من الحاوية، بدلا من العمل من المؤشر.

وحاول هذا بدلا من ذلك

int componentCount = cardPanel.getComponentCount();
logger.info("There are " + componentCount);
for (int i = 1; i < componentCount; i++) {
    cardPanel.remove(1);
}

نصائح أخرى

والجواب بيني هو الصحيح، ولكن اعتمادا على الحاوية، قد تكون غير فعالة. شيء مثل ArrayList لا حقا مثل إزالة الأشياء من عدة مرات الأمامية، لأنها نسخ كل ما تبقى من البيانات أسفل كل وقت.

وهنا بديل:

for (int i = cardPanel.getComponentCount() - 1; i >= 1; i--)
{
    cardPanel.remove(i);
}

وهذا في الأساس يبدأ من النهاية وتعمل من أجل البداية.

وانها لن يؤدي الا الى أن تكون كبيرة للمجموعات الكبيرة، ولكن الامر يستحق معرفة تقنية.

ومؤشرات تبدأ من 0، ثلاثة بنود تعني البند الأول في الفهرس 0، الثاني هو في الفهرس 1 والثالث وهكذا الأخير هو في الفهرس 2.

وContainer.remove (كثافة العمليات ط) يزيل هذا البند في مؤشر ط

والتعليمات البرمجية يزيل البنود في 1،2،3

وماذا تحاول أن تفعل؟ إذا كنت ترغب في إزالة كافة العناصر من وعاء ثم هو removeAll الحق في الاختيار.

إذا كنت بحاجة إلى معالجة البنود أثناء إزالة ثم تعبير نموذجي هو الذهاب من اقصاه الى الجبهة، كما يشرح جون السكيت.

ما لم يكن من الضروري أن تذهب من 0 إلى نهاية، وفي هذه الحالة عليك أن تبقي إزالة عنصر 0TH:

for (int i = 0; i < componentCount; i++) {
    cardPanel.remove(0);
}

إذا كنت ترغب في إزالة العناصر على أساس بعض شرط في أرقامها القياسية، وربما هو أفضل لاستخدام مكرر صريح لإزالتها مع الحفاظ العد الخاص للمؤشر.

وعلى سبيل المثال، لإزالة كافة الكائنات في مؤشر الغريب:

    int index = 0;
    final Iterator<String> iterator = list.iterator();
    while (iterator.hasNext())
    {
        iterator.next();
        if (index % 2 != 0)
        {
            iterator.remove();
        }
        index++;
    }

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top