IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Erreur "ArrayIndexOutOfBoundsException" dans une List<Point>


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 33
    Par défaut Erreur "ArrayIndexOutOfBoundsException" dans une List<Point>
    Bonsoir,

    Je suis actuellement en train de créer un programme pour un projet en terminale, mais j'obtient l'erreur du titre.
    Pour expliquer la situation, j'ai l'interface suivante:
    Nom : Colonisation interface finale.jpg
Affichages : 174
Taille : 169,5 Ko
    C'est un jeu dont le principe est le suivant: Le joueur commence à la case tout en haut à gauche, dans l'image la case bleue donc; lorsque que le joueur clique sur un bouton d'une certaine couleur, alors, toutes les cases situées de façon adjacente à la case du joueur qui seront de cette même couleur deviendront des cases "conquises".
    J'utilise la méthode ci-dessous afin de récupérer la couleur d'un pixel de la case situé au dessus de la case du joueur:
    (xph1 = coordonnée x de la case du joueur/xph2 coordonnée y de la case du joueur)
    (xh1= coordonnée x de la case au dessus de celle du joueur/xh1= coordonnée y de la case au dessus de celle du joueur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        public static void pColorh(BufferedImage image, Graphics g, int xph1, int xph2) {
      	     int xh1=xph1, xh2=xph2-25;
      	     System.out.println("xph1  "+xph1);
      	     System.out.println("xph2  "+xph2);
      	     System.out.println("xh1  "+xh1);
      	     System.out.println("xh2  "+xh2);
     
    		 if (xh2 >=0) {
    			 Color cph = new Color(image.getRGB(xh1, xh2));
    			 int pr3=cph.getRed();
    			 int pg3=cph.getGreen();
    			 int pb3=cph.getBlue();
    			 int cph1 = new Color(pr3,pg3,pb3).getRGB();
     
    			 while (cph1 ==cppd) {
    				 Point Ph = new Point(xh1,xh2);
    				 Color cphh = new Color(image.getRGB(xh1,xh2));
    				 int pr33=cphh.getRed();
    				 int pg33=cphh.getGreen();
    				 int pb33=cphh.getBlue();
    				 int cph11 = new Color(pr33,pg33,pb33).getRGB();
     
    				 if (cph11 != cppd) {
    					 break;
    				 }
    			 		g.setColor(new Color(pr3,pg3,pb3));
    			 		g.fillRect(xph1, xph2, 24, 24);
    			 		g.fillRect(xh1, xh2, 24, 24);
    					cases.addPoints(Ph);
    			 		xph2-=25;
    			 		xh2-=25;
    			 		cph1=cph11;
    			 }
    		 }
       }
    Ainsi si la couleur de la case du haut est la même que celle du joueur, alors cette nouvelle case sera conquise. Ce code est répété en boucle tant que les cases suivantes en haut ont la même couleur.
    Dans cette méthode, j'ajoute les coordonnées du point de la nouvelle case conquise à une liste de point à l'aide de la méthode "addPoints".
    J'utilise la méthode détaillée ci-dessus dans cette autre méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public static void pColor(BufferedImage image, Graphics g, Graphics2D g2) {
     
    	if (cases.getPoints().size() == 0) {
    		pColorh(image,g,1,1);
    	} else {
            for(int i=0; i<cases.getPoints().size(); i++) {
            	pColorh(image,g,cases.getPoints().get(i).x,cases.getPoints().get(i).y); 
            }
    	}
    Seulement, lorsque la méthode "pColorh" est utilisée, le code bloque à la ligne:
    " Color cphh = new Color(image.getRGB(xh1,xh2));"

    Il me semble que le message d'erreur s'affiche quand une coordonnée est négative, seulement j'ai ajouté "if (xh2 >=0) " qui normalement n'effectuait pas le code lorsque la coordonnée est négative.
    J'ai affiché dans la console les valeurs des variables qui sont utilisés dans la méthode et dans un de mes essais, j'ai obtenu ceci:
    "xph1 =1
    xph2 =51
    xh1 =1
    xh2 =26"
    Ce qui me semble cohérent, or j'obtient le message suivant au complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
    	at sun.awt.image.IntegerInterleavedRaster.getDataElements(Unknown Source)
    	at java.awt.image.BufferedImage.getRGB(Unknown Source)
    	at ListenerVertC.pColorh(ListenerVertC.java:162)
    	at ListenerVertC.pColor(ListenerVertC.java:240)
    	at ListenerVertC.<init>(ListenerVertC.java:28)
    	at Fenetre$ListenerVert.actionPerformed(Fenetre.java:67)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    	at java.awt.EventQueue.access$500(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.awt.EventQueue$3.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue$4.run(Unknown Source)
    	at java.awt.EventQueue$4.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Merci d'avance.
    (Désolé pour le pavé, je pense avoir besoin d'expliquer en détail)

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    oui enfin, c'est dans ta boucle while qu'il faut afficher tes coordoonnées, puisque tu fais -25 à chaque tour de boucle sans vérifier tes bornes.

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 33
    Par défaut
    Oui, je me suis mal exprimé, c'est ce que j'ai fais, c'est ce qu'affiche la console lors du dernier tour de la boucle.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ce n'est pas de la même boucle que parle @Tchize_. Ton code indique que les System.out.println sont dans la méthode pColorh, donc bien dans la boucle for(int i=0; i<cases.getPoints().size(); i++) {, mais pas dans la boucle while (cph1 ==cppd) {. Or cette boucle fait varie xh2 et xph2, en les décrémentant de 25 à chaque itération.

    Donc si "xph1 =1, xph2 =51, xh1 =1, xh2 =26" avant d'entrer dans la boucle, xh2 et xph2 vont varier :
    1. xh2=26, xph2=51
    2. xh2=1, xph2=26
    3. xh2=-24, xph2=2 : boum, -24 est hors des limites de l'image !



    Au passage ta boucle while est drôlement compliquée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    while (cph1 ==cppd) {
    				 Point Ph = new Point(xh1,xh2);
    				 Color cphh = new Color(image.getRGB(xh1,xh2));
    				 int pr33=cphh.getRed();
    				 int pg33=cphh.getGreen();
    				 int pb33=cphh.getBlue();
    				 int cph11 = new Color(pr33,pg33,pb33).getRGB();
     
    				 if (cph11 != cppd) {
    					 break;
    				 }
    			 		g.setColor(new Color(pr3,pg3,pb3));
    			 		g.fillRect(xph1, xph2, 24, 24);
    			 		g.fillRect(xh1, xh2, 24, 24);
    					cases.addPoints(Ph);
    			 		xph2-=25;
    			 		xh2-=25;
    			 		cph1=cph11;
    			 }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    while ( xh2>=0) { // attention : toujours faire une condition qui dépend de ce qui varie, pour garantir de ne pas "dépasser"
     
       cph1 = image.getRGB(xh1,xh2);
       if (cph1 == cppd) {
          g.setColor(new Color(cph1));
          g.fillRect(xph1, xph2, 24, 24);
          g.fillRect(xh1, xh2, 24, 24);
          cases.addPoints( new Point(xh1,xh2) );
          xph2-=25;
          xh2-=25;
       }
       else {
          break;
       }
    }
    Et tu peux même supprimer le if avant (du coup, il faudra juste typer cph1 dans le bloc de la boucle)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 33
    Par défaut
    Effectivement, c'était cette boucle qui posait le problème, il est maintenant réglé, merci beaucoup.

    Pour ce qui est de la boucle while compliquée, c'est que pour le moment j'essayais de faire en sorte que le programme en entier marche avant de commencer à le raccourcir; j'ai pas mal appris au cours du développement ce qui va me permettre de réduire drastiquement la taille du code et le nombre de class.

    Encore merci !

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par KoupaXII Voir le message
    Pour ce qui est de la boucle while compliquée, c'est que pour le moment j'essayais de faire en sorte que le programme en entier marche avant de commencer à le raccourcir; j'ai pas mal appris au cours du développement ce qui va me permettre de réduire drastiquement la taille du code et le nombre de class.
    Ce n'est pas seulement une question de faire concis et efficace : plus ton code est compliqué, plus il te sera difficile de comprendre les problèmes qui s'y trouvent le cas échéant, et pour nous aussi !
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. petite erreur d'implémentation dans une liste simplement chaînée
    Par johnny3 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 26/10/2008, 16h57
  2. Réponses: 7
    Dernier message: 29/04/2007, 10h37
  3. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo