Τι σημαίνει ArrayIndexOutOfBoundsException
και πώς μπορώ να το ξεφορτωθώ;
Ακολουθεί ένα δείγμα κώδικα που προκαλεί την εξαίρεση:
String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
System.out.println(name[i]);
}
Η πρώτη σας επαφή θα πρέπει να είναι η τεκμηρίωση που εξηγεί με αρκετή σαφήνεια:
Εκτοξεύεται για να υποδείξει ότι ένας πίνακας έχει προσπελαστεί με παράνομο δείκτη. Ο δείκτης είναι είτε αρνητικός είτε μεγαλύτερος ή ίσος με το μέγεθος του πίνακα.
Έτσι, για παράδειγμα:
int[] array = new int[5];
int boom = array[10]; // Throws the exception
Όσο για το πώς να το αποφύγετε... μην το κάνετε αυτό. Να είστε προσεκτικοί με τους δείκτες του πίνακα σας.
Ένα πρόβλημα που αντιμετωπίζουν μερικές φορές οι άνθρωποι είναι να νομίζουν ότι οι πίνακες είναι 1-δείκτες, π.χ.
int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
System.out.println(array[index]);
}
Αυτό θα παραλείψει το πρώτο στοιχείο (δείκτης 0) και θα πετάξει μια εξαίρεση όταν ο δείκτης είναι 5. Οι έγκυροι δείκτες εδώ είναι 0-4 συμπεριλαμβανομένων. Η σωστή, ιδιωματική δήλωση "for" εδώ θα ήταν:
for (int index = 0; index < array.length; index++)
(Αυτό βέβαια προϋποθέτει ότι χρειάζεστε τον δείκτη. Αν μπορείτε να χρησιμοποιήσετε τον ενισχυμένο βρόχο for αντί για αυτόν, κάντε το).
if (index < 0 || index >= array.length) {
// Don't use this index. This is out of bounds (borders, limits, whatever).
} else {
// Yes, you can safely use this index. The index is present in the array.
Object element = array[index];
}
Ενημέρωση: σύμφωνα με το απόσπασμα κώδικα σας,
for (int i = 0; i<=name.length; i++) {
Ο δείκτης είναι συμπεριλαμβανομένου του μήκους του πίνακα. Αυτό είναι εκτός ορίων. Πρέπει να αντικαταστήσετε το <=
με το <
.
for (int i = 0; i < name.length; i++) {
Αυτό σημαίνει ότι προσπαθείτε να προσπελάσετε έναν δείκτη ενός πίνακα που δεν είναι έγκυρος, καθώς δεν βρίσκεται μεταξύ των ορίων.
Για παράδειγμα, αυτό θα αρχικοποιούσε έναν πρωτόγονο ακέραιο πίνακα με το άνω όριο 4.
int intArray[] = new int[5];
Οι προγραμματιστές μετρούν από το μηδέν. Έτσι αυτό για παράδειγμα θα έφερνε μια ArrayIndexOutOfBoundsException
καθώς το άνω όριο είναι 4 και όχι 5.
intArray[5];