Προς το περιεχόμενο

Exception σε πρόγραμμα Java


Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Γεια σας. Υλοποιώ ένα παιχνίδι 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);
    }

 

Επεξ/σία από Επισκέπτης
Δημοσ.

Καλησπέρα albNik. Δοκίμασα κάτι άλλο τελικά, πιο μπακάλικο μεν, but it gets the work done!

Απλώς θέτω στις αντίστοιχες τιμές που θέλω να διαγράψω από το deck τη τιμή -1 και οπότε κάνω τη δουλειά μου. :)

Δημοσ.

Μέσα σε μία for όταν καλείς το size(), η for γνωρίζει την αρχική τιμή του size(), πχ 10. Αν αφαιρέσεις μία τιμή και αλλάξει, αναμενόμενα, το size(), αναμενόμενα επίσης θα πάρεις και exception. Πιθανότητα πήρες κάποιο "array out of bounds" ή κάτι παρόμοιο.

Μία λύση είναι αυτή που εφάρμοσες.

Εναλλακτικά θα μπορούσες να πεις while(player.size() != 0) {....}, και να αφαιρούσες κανονικά, απλά στο 0, θα τερματιζόταν η while.

Δημοσ.
22 λεπτά πριν, Kostas Palaiologos είπε

Μέσα σε μία for όταν καλείς το size(), η for γνωρίζει την αρχική τιμή του size(), πχ 10

Ο έλεγχος i<size() γίνεται σε κάθε iteration.
κάθε φορά συγκρίνεται με την τρεχουσα τιμή της size()

Δημοσ. (επεξεργασμένο)

Όντως. Στο foreach συμβαίνει αυτό που λέω, και το exception είναι το ConcurrentModificationException αν μιλάμε για λίστες.

To for loop βλέπει το size() στη τρέχουσα τιμή. Όπως και να έχει λίστες for και remove είναι και λιγάκι επικίνδυνο

Επεξ/σία από Επισκέπτης
Δημοσ.

Ναι συνάρτηση είναι η size() οπότε καλείται κάθε φορά. 

Ο λόγος για τον οποίο έκανα ArrayList ενώ αρχικά είχα ένα 2D Array ήταν αυτός ακριβώς, να μπορώ να προσθέτω-διαγράφω με άνεση.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...