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

Java Discussion :

Erreur ArrayIndex OutOfBoundsException


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut Erreur ArrayIndex OutOfBoundsException
    Bonjour j'ai un petit problème dans un programme java
    ce programme est un parseur de trame NMEA j'arrive a recevoire ces trames les convertire ainsi que les stocker dans une BD
    le probleme c'est que au bout de 3 a 5 trames le programme plante et m'affiche l'erreur suivante:

    java.lang.ArrayIndexOutOfBoundsException: 12 je sais que c'est une erreur de deppasement de capacite mais j'ai pas pu la localiser
    j'ai pu determiner l'emplacement de l'erreur c'est dans la fonction de stockage dans la base de donnee (ci-dessous)

    une autre chause c que pour chaque réception de trame une erreur ce genre mais elle ne bloque pas le programme les détails de cette erreur sont:

    java.net.BindException: Address already in use: JVM_Bind
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.bind(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at serveur$conexion.getconexion(serveur.java:397)
    at serveur$conexion.getMessage(serveur.java:422)
    at serveur$conexion.getconexion(serveur.java:400)
    at serveur$RunImpl.run(serveur.java:381)
    at java.lang.Thread.run(Unknown Source)

    voici la fonction responsable du stockage dans la base de donnee

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
     
    		public void InserSql()
    		{
    			Connection con=null;
    			PreparedStatement ps=null;
     
    			try
    			{
    				String cmd;
    				cmd=null;temp=null;
    				cmd="insert into trame(id,type,temps,etat,coord,vitesse,cap,date,declin,chek) values(null,'";
    				cmd=cmd+type+"','";
    				temp=heure[0]+":"+heure[1]+":"+heure[2];
    				H=temp;
    				cmd=cmd+temp+"','";
    				cmd=cmd+etat+"',";
     
    		 		temp=temp.valueOf(latitude[0]);
    		 			temp=temp+"°"+latitude[1];
    		 			temp=temp+"."+latitude[2];
    		 			temp=temp+directionlat;
    		 			La=temp;
    		 			String coord=new String();
    		 			coord="Geomfromtext('Point(21 21)')";
    		 			cmd=cmd+coord+",";
     
    		 		temp=temp.valueOf(longitude[0]);
    	 			temp=temp+"°"+longitude[1];
    	 			temp=temp+"."+longitude[2];
    	 			temp=temp+directionlong;
    	 			Lo=temp;
     
     
    	 			cmd=cmd+vitesse+",'";
    		 		cmd=cmd+cap+"','";
    		 		System.out.println("6");
    		 		temp="";
    		 		for(int i=0;i<3;i++)
    		 			temp=temp+date[i]+"-";	
    		 		cmd=cmd+temp.substring(0, temp.length()-1)+"','";
    		 		D=temp.substring(0, temp.length()-1);
     
    		 		temp=dec+directiondec;	
    		 		cmd=cmd+temp+"','";
    		 		cmd=cmd+checksum+"')";
    		 		System.out.println("cmd = "+cmd);
     
     
     
    				Class.forName("com.mysql.jdbc.Driver");
    				con = DriverManager.getConnection("jdbc:mysql://localhost:3306/NMEA","root","boumacmilan");
     
    				ps = con.prepareStatement(cmd);
    				System.out.println("tst1");
    				ps.executeUpdate();
    				System.out.println("tst2");
    				JOptionPane.showMessageDialog(null, "c'est fait!!","Display Message",  JOptionPane.INFORMATION_MESSAGE);
     
    			}
    			catch(Exception e)
    			{
    				JOptionPane.showMessageDialog(null, "une erreur c'est produite les details sont: "+e,"Display Message",  JOptionPane.ERROR_MESSAGE);
    			}
     
     
    		}

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    2 choses
    1/ il me semble qu'en java les chaines ont une taille limite. mais je ne pense pas que cela vienne de là.


    2/ avant d'insérer ta donnée en base, peux tu vérifier que la longueur est acceptable pour l'endroit ou tu veux l'insérer?

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Par défaut
    Merci pour votre reponse
    mais j'ai verifié mais rien ne depasse ça capacite dans la base de donnees
    ce que je ne comprant pas c'est que ça varie parfois c'est au bout de 3 trames qu'il se block d'autre fois 5 ou 6 ....

  4. #4
    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
    regare à la ligne pointée par l'exception. Tu y accède à l'index 12 d'un tableau qui n'a pas cette taille. Difficile pour nous de deviner dans ton code où c'est.

    Quand à ton erreur "Address already in use: JVM_Bind", il faut regarder à at serveur$conexion.getconexion(serveur.java:397), tu y crée une socket d'écoute sur un port qui et déjà en écoute.

  5. #5
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 688
    Par défaut
    1/ il me semble qu'en java les chaines ont une taille limite. mais je ne pense pas que cela vienne de là.
    Les strings n'ont pas vraiment de de taille limite si ce n'est peut-être la taille d'un int (2^31 caractères) que tu n'atteindra probablement jamais car tu auras épuisé la mémoire heap avant d'avoir atteint cette limite.

    Pour l'erreur de connexion, elle semble tout simplement venir du fait que tu recrée une connexion a la basse de données a chaque InserSql() mais que tu ne la fermes pas une fois ton action terminée. Donc si tu le lances une nouvelle fois, le port de connexion à la BD est déjà occupé
    Faire un con.close();à la fin de ta requette devrait corriger le problème.

    Comme dit tchize pour le "array out of bounds" connaitre la ligne serait d'une grande aide surtout que le bout de code que tu a posté ne nous permet pas de connaitre la taille des tableaux que tu utilises.

  6. #6
    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
    Citation Envoyé par Uther Voir le message

    Pour l'erreur de connexion, elle semble tout simplement venir du fait que tu recrée une connexion a la basse de données a chaque InserSql() mais que tu ne la fermes pas une fois ton action terminée. Donc si tu le lances une nouvelle fois, le port de connexion à la BD est déjà occupé
    Non, les connection réseau, c'est du one-to-many, on peux ouvrir autant de connnection qu'on veux vers le meme serveur sql, sans gros soucis (c'est ce que font les connection pools), je pencherais plutot pour sa capture de trame qui créerais deux socket udp sur le même port:
    at serveur$conexion.getconexion(serveur.java:397)
    at serveur$conexion.getMessage(serveur.java:422)
    at serveur$conexion.getconexion(serveur.java:400)

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par Uther Voir le message
    Les strings n'ont pas vraiment de de taille limite si ce n'est peut-être la taille d'un int (2^31 caractères) que tu n'atteindra probablement jamais car tu auras épuisé la mémoire heap avant d'avoir atteint cette limite.
    Il y'a toujours des limites quelque soit le langage / l'os.... si une ram de capacité infinie existait par exemple ça se saurait ^^

    http://java.sun.com/docs/books/jvms/...doc.html#88659
    The length of field and method names, field and method descriptors, and other constant string values is limited to 65535 characters by the 16-bit unsigned length item of the CONSTANT_Utf8_info structure (?4.4.7). Note that the limit is on the number of bytes in the encoding and not on the number of encoded characters. UTF-8 encodes some characters using two or three bytes. Thus, strings incorporating multibyte characters are further constrained. (emphasis mine)

    il y'en a une sur les constante string par exemple.

  8. #8
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    c'est bien pour cela que j'ai employé le mot constante dans mes phrases....

Discussions similaires

  1. Erreur "OutOfBoundsException" avec un tableau
    Par astran dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/01/2013, 18h17
  2. Erreur Array Index OutOfBoundsException
    Par bakaratoun dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 28/02/2009, 18h12
  3. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  4. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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