Επισκέπτης Δημοσ. 5 Ιανουαρίου 2018 Δημοσ. 5 Ιανουαρίου 2018 (επεξεργασμένο) Γεια σας. Υλοποιώ ένα παιχνίδι domino και μου βγάζει out of bounds exception για το ArrayList που αναπαριστά το deck στο σημείο όπου ο παίκτης "παίζει" ένα domino και πρέπει να διαγραφεί από το deck του. Τα getX,getY παίρνουν από τη κλάση του παίκτη τις αντίστοιχες τιμές του ζεύγους domino. Τα ορίσματα x,y προφανώς είναι οι τιμές που θέλω να διαγραφούν(δηλαδή το domino piece που "παίζω"). Η size() επιστρέφει το size του deckX(το οποίο προφανώς είναι ίδιο με το deckY). public void removeFromDeck(int who,int x,int y){ int key = 0; if (who==1){ for (int i=0;i<player.size();i++){ if (player.getX(i)==x && player.getY(i)==y || player.getY(i)==x && player.getX(i)==y){ key = i; player.remove(i); break; } } } else{ for (int i=0;i<bot.size();i++){ if (bot.getX(i)==x && bot.getY(i)==y || bot.getY(i)==x && bot.getX(i)==y){ key = i; bot.remove(i); break; } } } } *Το who έχει να κάνει με το αν παίζει ο ίδιος ο παίκτης η το bot. Τι κάνω λάθος; Να πω ότι τα κομμάτια του domino τα αναπαριστώ με 2 ArrayLists deckX,deckY και μόλις καλώ την remove(i) η συνάρτηση που καλείται στη κλάση του παίκτη είναι η: public void remove(int i){ deckX.remove(i); deckY.remove(i); } Επεξ/σία 5 Ιανουαρίου 2018 από Επισκέπτης
albNik Δημοσ. 5 Ιανουαρίου 2018 Δημοσ. 5 Ιανουαρίου 2018 Έλεγξε με debugger τι τιμή έχουν τα i, bot.size(), deckX.size() και deckY.size() μόλις πας να κανείς bot.remove().
Επισκέπτης Δημοσ. 5 Ιανουαρίου 2018 Δημοσ. 5 Ιανουαρίου 2018 Καλησπέρα albNik. Δοκίμασα κάτι άλλο τελικά, πιο μπακάλικο μεν, but it gets the work done! Απλώς θέτω στις αντίστοιχες τιμές που θέλω να διαγράψω από το deck τη τιμή -1 και οπότε κάνω τη δουλειά μου.
Επισκέπτης Δημοσ. 5 Ιανουαρίου 2018 Δημοσ. 5 Ιανουαρίου 2018 Μέσα σε μία for όταν καλείς το size(), η for γνωρίζει την αρχική τιμή του size(), πχ 10. Αν αφαιρέσεις μία τιμή και αλλάξει, αναμενόμενα, το size(), αναμενόμενα επίσης θα πάρεις και exception. Πιθανότητα πήρες κάποιο "array out of bounds" ή κάτι παρόμοιο. Μία λύση είναι αυτή που εφάρμοσες. Εναλλακτικά θα μπορούσες να πεις while(player.size() != 0) {....}, και να αφαιρούσες κανονικά, απλά στο 0, θα τερματιζόταν η while.
albNik Δημοσ. 5 Ιανουαρίου 2018 Δημοσ. 5 Ιανουαρίου 2018 22 λεπτά πριν, Kostas Palaiologos είπε Μέσα σε μία for όταν καλείς το size(), η for γνωρίζει την αρχική τιμή του size(), πχ 10 Ο έλεγχος i<size() γίνεται σε κάθε iteration. κάθε φορά συγκρίνεται με την τρεχουσα τιμή της size()
Επισκέπτης Δημοσ. 5 Ιανουαρίου 2018 Δημοσ. 5 Ιανουαρίου 2018 (επεξεργασμένο) Όντως. Στο foreach συμβαίνει αυτό που λέω, και το exception είναι το ConcurrentModificationException αν μιλάμε για λίστες. To for loop βλέπει το size() στη τρέχουσα τιμή. Όπως και να έχει λίστες for και remove είναι και λιγάκι επικίνδυνο Επεξ/σία 5 Ιανουαρίου 2018 από Επισκέπτης
Επισκέπτης Δημοσ. 5 Ιανουαρίου 2018 Δημοσ. 5 Ιανουαρίου 2018 Ναι συνάρτηση είναι η size() οπότε καλείται κάθε φορά. Ο λόγος για τον οποίο έκανα ArrayList ενώ αρχικά είχα ένα 2D Array ήταν αυτός ακριβώς, να μπορώ να προσθέτω-διαγράφω με άνεση.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα