Ritardo rimozione oggetto in java

di il
4 risposte

Ritardo rimozione oggetto in java

Buonasera, sto lavorando ad un progetto in java, che consiste nella realizzazione di un gioco. il gioco consiste nel colpire un oggetto carro con un'altro oggetto bomba, e ritardare la rimozione dell'oggetto carro dall' array list. Il problema che mi si è posto a cui non sono riuscito a trovare una soluzione è questo, durante il gioco mi si presenta tale errore:
Exception in thread "Thread-10" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.rangeCheck(ArrayList.java:653)
	at java.util.ArrayList.get(ArrayList.java:429)
	at wargame.LOGIC.GameController.collisioni(GameController.java:55)
	at wargame.GUI.GamePanel$GameThread.run(GamePanel.java:226)
	at java.lang.Thread.run(Thread.java:745)
da come ho capito è un'errore di overflow dell'array, cioè io non ho oggetti all'interno dell'array, ma accedo ad un area di memoria che di per se non contiene nulla, giusto?

il codice della collisione tra i due oggetti è il seguente:
public void collisioni(GeneratoreBombe pBombe, CamionGenerator pCamion) {

        long valoreInit = 0;
        long valoreFinal;

        if (blocco) {
            for (int i = 0; i < pBombe.getArraySize(); i++) {
                for (int j = 0; j < pCamion.getArraySize(); j++) {

                    if ((i < 0) && (j < 0)) {
                        //non fa niente
                    }else{
                        if (pBombe.getBombe().get(i).isVisible() && pCamion.getArrayCamion().get(j).isVisible()) {
                            if ((GestoreCollisioni.visualizzaCollisioni(pBombe.getBombe().get(i).getBombaRect(), pCamion.getArrayCamion().get(j).getCamionRect()))) {

                                blocco = false;
                                pBombe.getBombe().get(i).setVisible(false);
                                pBombe.getBombe().get(i).setInvisible(true);
                                pCamion.getArrayCamion().get(j).setVisible(false);
                                pCamion.getArrayCamion().get(j).setDestroyed(true);
                                valoreInit = System.currentTimeMillis();

                                
                                
                                for (int k = 0; k < pBombe.getArraySize(); k++) {
                                    if (pBombe.getBombe().get(k).isInvisible()) {
                                        pBombe.removeElement(k);
                                    }
                                }

                                
                                do {
                                    valoreFinal = System.currentTimeMillis();
                                } while (valoreFinal - valoreInit < 20);

                                blocco = true;
                                valoreInit = 0;

                                for (int y = 0; y < pCamion.getArraySize(); y++) {
                                    if (pCamion.getArrayCamion().get(y).isDestroyed()) {
                                        pCamion.removeElement(j);
                                    }
                                }
                                countObjectDestroyed++;
                            }
                        }
                    }
                }
            }
        }
    }
E' un poco strano come codice, ma ho preferito utilizzare una specie di lock, invece che un thread, il quale ogni volta mi ritardava la rimozione dell'oggetto carro.
Spero che il codice si comprensibile, chiedo aiuto, perchè non so più dove sbattere la testa.
Grazie in anticipo

4 Risposte

  • Re: Ritardo rimozione oggetto in java

    L'errore e' ben spiegato: stai cercando di accedere all'elemento con indice 0 di un array di lunghezza 0!
    E' ovvio che tale element non esiste,

    Ti dice anche a che linea di codice cio' avviene:

    GameController.java linea 55
  • Re: Ritardo rimozione oggetto in java

    Ti ringrazio per la risposta, si ho notato che accedo ad un area di memoria in cui non è presente nessun elemento, quale potrebbe essere un'eventuale soluzione che mi consenta di risolvere tale problema?
    io ho provato a impostare questa condizione prima del primo for, in tal modo:
    if (pBombe.getArraySize() > 0 && pCamion.getArraySize() > 0) 
    grazie mille
  • Re: Ritardo rimozione oggetto in java

    Purtroppo sei in un contesto multithreading poiche' hai a che fare con l'interfaccia utente.

    Le tecniche: riprova, sarai piu' fortunato in questo caso non funzionano.

    Non c'e' una tecnica: se il codice sta' funzionando male, allora vuol dire che c'e' una logica sbagliata alla base della sua implementazione!

    Eventuali accrocchi atti a salvare la situazione si possono anche trovare, ma saranno, appunto, accrocchi!
  • Re: Ritardo rimozione oggetto in java

    Ok, nel caso io debba ritardare la rimozione di un'elemento da un'array come dovrei procedere in maniera regolare. Tieni presente che io aggiungo elementi nell'array in maniera random, e la rimozione ritardata avviene quando faccio collidere due rettangoli, che sono i miei due oggetti.
    in questo caso la rimozione come dovrebbe essere gestita?
    Grazie mille
Devi accedere o registrarti per scrivere nel forum
4 risposte