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 :

Problème de ArrayIndexOutOfBoundException


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 9
    Points
    9
    Par défaut Problème de ArrayIndexOutOfBoundException
    Bonjour,

    Maintenant je vois le bout de ma bataille navale (avant d'attaque l'interface graphique ... ) et je suis dans les tests.
    J'ai donc créé une grille de dimension 10x10x2 (GrilleJeu(10)), le x2 sert à l'identifiant du joueur, plutôt que de faire 2 grilles, on ne fait qu'une grille a 3 coordonnées, l'identifiant du joueur 1 est donc 0 et l'identifiant du joueur 2 est 1. Puis je lance mes tirs entre 0 et 9.

    Ma bataille navale comporte des Malus et des Bonus, ici premier tir, un Malus et la BIM ArrayIndexOutOfBoundException : 9. Je ne comprend pas, je suis les erreurs et ça me ramène à la méthode valeurGrille (int i, int j, in k) où ils me disent ça !!! Le choque !! Je ne sais pas pourquoi car le premier tir était aux coordonnées (3,5)

    Je vous mets le code progressivement :

    On lance le tour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			if(joueur1.getListeCo().vide() == false){
    				System.out.println(joueur1.getPseudo()+" en place");
    				untour1 = new UnTour(joueur1,joueur2,grille);
    				untour1.tour();
    Cela nous envoi au Malus tirSursaCarte() : (problème à la ligne 32 sur la méthode enregistrePosTouche())
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    // Méthode qui renvoi le tir du joueur sur sa propre carte
    	public void tirSurSaCarte(){
     
    			// Déclaration des variables utiles
    			int k = 0;
    			int abs = 0;
    			int ord = 0;
    			String nomNavire = null;
    			int coorddetir[] = new int[2];
    			boolean verif[] = new boolean[17];
    			boolean coule;
     
     
    			//Début du programme 
     
    			//phase de tir
    			coorddetir = super.tirGrille(super.joueur);
    			System.out.println("Mince! Le missile est parti sur ta carte");
     
    			//Vérifie si un navire est touché et/ou coulé
    			k = 0;
    			coule = false;
    			for (int i=0;i<super.joueur.getListeBat().getTailleLisNav();i++){
    				for(int j=0;j<super.joueur.getListeBat().donneElement(i).getTaille();j++){
    					verif[k]=super.joueur.getListeBat().donneElement(i).getPositionTouche()[j];
    					k=k+1;
    				}
    			}
    			k = 0;
    			nomNavire = null;
    			for (int i=0;i<super.joueur.getListeBat().getTailleLisNav();i++){
    				super.joueur.getListeBat().donneElement(i).enregistrePosTouché(super.grille, super.joueur.getIdGrille());
    				for(int j=0;j<super.joueur.getListeBat().donneElement(i).getTaille();j++){
    					if(verif[k]!=super.joueur.getListeBat().donneElement(i).getPositionTouche()[j]){
    						nomNavire = super.joueur.getListeBat().donneElement(i).getNomNavire();
    						abs = coorddetir[0];
    						ord = coorddetir[1];
    					}
    					k=k+1;
    					if(super.joueur.getListeBat().donneElement(i).estIlCoule() == true){
    						coule = true;
    						super.joueur.getListeCo().suprCoord(super.joueur.getListeCo().donneElement(i));
    					}
    				}
    			}
    			if(nomNavire != null && coule == false){
    				System.out.println("Aïe.. tu as touché ton "+nomNavire+" aux coordonnées ("+abs+","+ord+")");
    			}
    			else if(nomNavire != null && coule == true){
    				System.out.println("C'est dommage mais tu as coulé ton "+nomNavire);
    			}
    			else{
    				System.out.println("Attention ... Ouf ! Tu n'as rien touché ! C'est pas passé loin pourtant !");
    			}
    		}
    On suit les erreur, on arrive à la classe Navires dans la méthode : (erreur ligne 12 qui nous renvoi à la méthode valeurGrille(i,j,k)
    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
    // Méthode qui enregistre la boolean de la grille où le joueur à tiré dans le tableau des positions touchées
    	public void enregistrePosTouche(GrilleJeu grille,int id){
    		int abs=0;
    		int ord=0;
     
    		// Si les abscisses sont égales
    		if (this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0]==this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[1][0]){
    			abs=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0];
    			for(int i=0; i<this.taille; i++){
    				if(this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1]<this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[1][1]){
    					ord=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1]+i;
    						this.positionTouche[i]=grille.valeurGrille(abs, ord,id);	
    				}
    				else{
    					ord=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1]-i;
    					this.positionTouche[i]=grille.valeurGrille(abs, ord,id);
    				}
    			}
    		}
     
    		// Si les ordonnées sont égales
    		if (this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1]==this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[1][1]){
    			ord=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][1];
    			for(int i=0; i<this.taille; i++){
    				if(this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0]<this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[1][0]){
    					abs=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0]+i;
    						this.positionTouche[i]=grille.valeurGrille(abs, ord,id);
    				}
    				else{
    					abs=this.joueur.getListeCo().donneElement(this.joueur.getListeBat().positionBat(this))[0][0]-i;
    					this.positionTouche[i]=grille.valeurGrille(abs, ord,id);
    				}
    			}
    		}
    	}
    Et enfin méthode valeurGrille qui me dit que je suis en dehors de mes limites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	//Renvoie la valeur de la grille aux coordornées voulues
    		public boolean valeurGrille(int i, int j, int k){
    			return grille[i][j][k];
    Voila.. Donc j'ai cherché une erreur dans le positionnement, pour ça j'ai fais afficher les coordonnées avant d'utiliser valeurGrille et ça plante aux coordonnées (7,9,1) qui existent normalement dans ma grille...

    Je ne comprend pas ! Une solution serait vraiment la bienvenue !

    Laure

  2. #2
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    C'est bien mais ce code nous est inutile:

    on n'a pas le message d'erreur exact que tu reçois ni sa stacktrace
    on n'a que des bout de code qui ne permettent pas de suivre quel objet fait quoi et va où.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    voila voila

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
    at BatNav.GrilleJeu.valeurGrille(GrilleJeu.java:46)
    at BatNav.Navires.enregistrePosTouche(Navires.java:321)
    at BatNav.UnTour.tour(UnTour.java:169)
    at BatNav.PartieBatNav.main(PartieBatNav.java:175)

    Vu que je l'ai décris je ne pensais pas que c'était nécessaire je suis désolée !

    Si tu as besoin de plus d'éléments je te les donne sans problème !
    Petite précision, j'ai en tout 11 classes : GrilleJeu, Navires, ListeNav, NodeNav, Joueur, ListeCoord, NodeCoord, UnTour, Bonus, Malus et PartieBatNav !

    Laure

  4. #4
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    faut plus de code là, comme je l'ai dit, on ne vois pas d'où sortent tes valeur, comment elles sont initialisées, etc. Donne nous un code plus complet, on a juste 3 méthode dont 90% du contenu est inutilisable car on ignore ce qui se trouve derrière.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Mai 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2015
    Messages : 23
    Points : 9
    Points
    9
    Par défaut
    Ne t'embête plus .. Je suis désolée.. je viens de trouver mon erreur.. erreur stupide.. vraiment désolée pour le dérangement... c'est rangeant de passer des heures à chercher quelque chose d'aussi nul...

    Laure

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

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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