Menu

Problème d'assignation d'objet dans un tableau [Résolu/Fermé]

OmeGaFire_ 83 Messages postés dimanche 19 juin 2016Date d'inscription 19 janvier 2018 Dernière intervention - 20 avril 2017 à 02:08 - Dernière réponse : OmeGaFire_ 83 Messages postés dimanche 19 juin 2016Date d'inscription 19 janvier 2018 Dernière intervention
- 22 avril 2017 à 19:30
Bonjour,
J'ai écrit un code qui, à chaque instance d'un objet spécifié, fait une copie de cet objet dans un tableau. Seulement, cette partie de code fait planter mon code pour une ArrayOutOfBoundsException.

Code:

package fr.killuaah.cmd.cmdmanager;


public class Command {

int argsNumber;
String prefix;





public Command(int argsNumbers, String prefixx) {

commandManager.commandsInstances++;
commandManager.commandrep[commandManager.commandsInstances-1] = this;



//Variables de l'objet
argsNumber = argsNumbers;
prefix = prefixx;




La classe principale, où les tableaux sont créés:

package fr.killuaah.cmd.cmdmanager;

import java.util.Scanner;



public class commandManager {

public static int commandsInstances = 0;
public static Command[] commandrep = {};
public static void main(String[] args) {
// TODO Auto-generated method stub

boolean b = true;
String[] command;
Command c = new Command(4,"salut");

while (b) {
System.out.print(">>");
Scanner sc = new Scanner(System.in);
command = sc.nextLine().split(" ");
System.out.println(commandManager.commandsInstances);
}




}




}








L'erreur:



Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at fr.killuaah.cmd.cmdmanager.Command.<init>(Command.java:16)
at fr.killuaah.cmd.cmdmanager.commandManager.main(commandManager.java:16)


Merci de m'aider c:
Bonne journée.
Afficher la suite 

8 réponses

KX 15557 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 juin 2018 Dernière intervention - 20 avril 2017 à 19:18
0
Merci
Bonjour,

ArrayIndexOutOfBoundsException: 0
signifie que tu essayes d'accéder à la case 0 qui n'existe pas, ce qui est normal puisque ton tableau est initialisé avec
commandrep = {}
et qu'il est donc de taille 0...

Il faudrait que le tableau ait au moins une taille de 1 pour utiliser la case 0.
OmeGaFire_ 83 Messages postés dimanche 19 juin 2016Date d'inscription 19 janvier 2018 Dernière intervention - 21 avril 2017 à 23:51
Mais je ne peux pas lui donner un nombre illimité de cases dès sa création ?
KX 15557 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 juin 2018 Dernière intervention - 22 avril 2017 à 18:14
Non, aucun objet n'a jamais de taille illimité car il faut toujours que le système d'exploitation (via la JVM) puisse réserver un espace mémoire contiguë permettant de stocker cet objet.

Mais si tu veux faire un espace de stockage "illimité" il faudrait plutôt que tu regardes comment fonctionnent les listes. Il y en a plusieurs implémentations mais par exemple les ArrayList ont une capacité qui se redimensionne automatiquement par copier-coller de ses éléments d'un tableau à un autre plus grand.

Exemple :

List<Command> commandRep = new ArrayList<Command>();
Command command = ...
commandRep.add(command);
OmeGaFire_ 83 Messages postés dimanche 19 juin 2016Date d'inscription 19 janvier 2018 Dernière intervention - 22 avril 2017 à 18:48
Je connaissait les ArrayLists, mais elles marchent de la même façon que les tableaux sur le stockage ?
KX 15557 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 juin 2018 Dernière intervention - 22 avril 2017 à 19:00
La structure interne d'une ArrayList c'est un tableau (d'où son nom Array = Tableau)

La classe ArrayList masque les difficultés liées au tableau (comme le redimensionnement) afin de rendre son utilisation plus simple, mais dans son fonctionnement - notamment en terme de performances - c'est la même chose.
OmeGaFire_ 83 Messages postés dimanche 19 juin 2016Date d'inscription 19 janvier 2018 Dernière intervention > KX 15557 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 juin 2018 Dernière intervention - 22 avril 2017 à 19:30
Ok merci :) Je met cette discussion en résolue !