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 :

OutOfMemoryError par appending sur un stringBuffer d'une chaine de trois caracteres.


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Points : 24
    Points
    24
    Par défaut OutOfMemoryError par appending sur un stringBuffer d'une chaine de trois caracteres.
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    import java.lang.StringBuilder;
    import java.io.StringReader;
    import java.io.IOException;
     
    public class AccentManager {
     
    	public String forUrl (String _string){
    		StringBuilder _sBuild = null;
    		try{
    			StringReader _sRead = new StringReader(_string);
    			_sBuild = new StringBuilder();
     
    			char c = (char)_sRead.read();
    			while( c != -1){
    				_sBuild.append(convertAccent(c));
    				c = (char)_sRead.read();
    			}
    			_sRead.close();
    		}catch (IOException e) {e.printStackTrace();}
    		return _sBuild.toString();
    	}
     
    	public String wAndWoAccents (String _string){
    		StringBuilder _sBuild = null;
    		try{
    		StringReader _sRead = new StringReader(_string);
    		_sBuild = new StringBuilder();
     
    		char c = (char)_sRead.read();
    		while( c != -1){
    			_sBuild.append(removeAccent(c));
    			c = (char)_sRead.read();
    		}
    		_sRead.close();
    		}catch (IOException e) {e.printStackTrace();}
    		return _sBuild.toString();
    	}
     
    	private String convertAccent(char c) {
    		if (c == 'à') return "%E0";
    		if (c == 'á') return "%E1";
    		if (c == 'â') return "%E2";
    		if (c == 'ã') return "%E3";
    		if (c == 'ä') return "%E4";
    		if (c == 'å') return "%E5";
    		if (c == 'æ') return "%E6";
    		if (c == 'ç') return "%E7";
    		if (c == 'è') return "%E8";
    		if (c == 'é') return "%E9";
    		if (c == 'ê') return "%EA";
    		if (c == 'ë') return "%EB";
    		if (c == 'ì') return "%EC";
    		if (c == 'í') return "%ED";
    		if (c == 'î') return "%EE";
    		if (c == 'ï') return "%EF";
     
    		if (c == 'À') return "%C0";
    		if (c == 'Á') return "%C1";
    		if (c == 'Â') return "%C2";
    		if (c == 'Ã') return "%C3";
    		if (c == 'Ä') return "%C4";
    		if (c == 'Å') return "%C5";
    		if (c == 'Æ') return "%C6";
    		if (c == 'Ç') return "%C7";
    		if (c == 'È') return "%C8";
    		if (c == 'É') return "%C9";
    		if (c == 'Ê') return "%CA";
    		if (c == 'Ë') return "%CB";
    		if (c == 'Ì') return "%CC";
    		if (c == 'Í') return "%CD";
    		if (c == 'Î') return "%CE";
    		if (c == 'Ï') return "%CF";
    		return "" + c;
    	}
     
    	private String removeAccent(char c) {
    		if (c == 'à') return c+"|a";
    		if (c == 'á') return c+"|a";
    		if (c == 'â') return c+"|a";
    		if (c == 'ã') return c+"|a";
    		if (c == 'ä') return c+"|a";
    		if (c == 'å') return c+"|a";
    		if (c == 'æ') return c+"|(?:ae)";
    		if (c == 'ç') return c+"|c";
    		if (c == 'è') return c+"|e";
    		if (c == 'é') return c+"|e";
    		if (c == 'ê') return c+"|e";
    		if (c == 'ë') return c+"|e";
    		if (c == 'ì') return c+"|i";
    		if (c == 'í') return c+"|i";
    		if (c == 'î') return c+"|i";
    		if (c == 'ï') return c+"|i";
     
    		if (c == 'À') return c+"|A";
    		if (c == 'Á') return c+"|A";
    		if (c == 'Â') return c+"|A";
    		if (c == 'Ã') return c+"|A";
    		if (c == 'Ä') return c+"|A";
    		if (c == 'Å') return c+"|A";
    		if (c == 'Æ') return c+"|(?:AE)";
    		if (c == 'Ç') return c+"|C";
    		if (c == 'È') return c+"|E";
    		if (c == 'É') return c+"|E";
    		if (c == 'Ê') return c+"|E";
    		if (c == 'Ë') return c+"|E";
    		if (c == 'Ì') return c+"|I";
    		if (c == 'Í') return c+"|I";
    		if (c == 'Î') return c+"|I";
    		if (c == 'Ï') return c+"|I";
    		return "" + c;
    	}
     
     
    }
    et à l'appel de la méthode forUrl()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at java.util.Arrays.copyOf(Arrays.java:2882)
    	at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
    	at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
    	at java.lang.StringBuilder.append(StringBuilder.java:119)
    	at AccentManager.forUrl(AccentManager.java:15)
    	at TrigramFinder.findNext(TrigramFinder.java:20)
    	at TrigramBasedSynthesis.main(TrigramBasedSynthesis.java:17)
    la string passée en argument à forUrl mesure 3 caractères de long.

  2. #2
    Membre actif

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Points : 295
    Points
    295
    Par défaut
    Bonjour,

    tu castes le retour de la méthode read de StringReader en char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char c = (char)_sRead.read();
    Alors que cette méthode retourne un int, par conséquent, ta validation si la valeur fait -1 n'est plus correcte dessus.

    Tu devrais donc caster ton int uniquement lorsque tu as besoin de l'utiliser en char, donc a la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _sBuild.append(convertAccent(c));
    et laisser le reste du temps c en int, ainsi, tu pourras gérer correctement ton retour a -1

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    merci beaucoup, je n'avais pas réalisé qu'un char ne pouvait pas être un nombre négatif.

    Ceci-dit Syst...ln((char)-1) donne ?...

    J'ai aussi eu du mal à appliquer tes conseils : je continuais d'avoir la même erreur. Il ma fallut supprimer mes fichiers class et les "recompiler" pour que cela fonctionne. Ce problème m'arrivait de temps en temps lors d'un précédent projet. Comme je suis feignant, j'ai préféré copier-coller les accents dans le fichiers plutot que de trouver le code unicode de chacun et par conséquent j'ajoute -encoding UTF-8 à javac. Est-ce que cela à un lien ?

    encore merci

  4. #4
    Membre actif

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Points : 295
    Points
    295
    Par défaut
    Ceci-dit Syst...ln((char)-1) donne ?...
    Oui, il donne un caractère bizarre en fonction de ton encodage mais clairement un caractère non utilisable (chez moi, cela fait un carre par exemple)

    J'ai aussi eu du mal à appliquer tes conseils : je continuais d'avoir la même erreur. Il ma fallut supprimer mes fichiers class et les "recompiler" pour que cela fonctionne. Ce problème m'arrivait de temps en temps lors d'un précédent projet. Comme je suis feignant, j'ai préféré copier-coller les accents dans le fichiers plutot que de trouver le code unicode de chacun et par conséquent j'ajoute -encoding UTF-8 à javac. Est-ce que cela à un lien ?
    La, c'est plus un problème de cache de tes fichiers class, normalement, pas réellement de l'encoding (j'ai par contre jamais eu ce problème avec javac, plus avec les IDE ou ant/maven)

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il est meme recommandé de toujours passer le paramètre -encoding à javac, que tu aie fait tes fichiers en iso-8859-15 ou en utf-8, sinon javac prend l'encodage de ta plateforme, qui n'est pas nécessairement la meme que celle des autres développeurs du projet!

Discussions similaires

  1. [AC-2007] Valeur par défaut sur les colonnes d'une liste déroulante.
    Par Gorane dans le forum IHM
    Réponses: 5
    Dernier message: 07/02/2012, 19h26
  2. Calcul ligne par ligne sur le résultat d'une requête
    Par CanardJM dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/04/2008, 13h06
  3. Réponses: 4
    Dernier message: 18/07/2007, 14h10
  4. [mysql 4.11] Select sur la taille d'une chaine de caractère
    Par epeichette dans le forum Requêtes
    Réponses: 8
    Dernier message: 19/06/2007, 09h50
  5. Question sur les Regex. interdire une chaine
    Par cysboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/05/2007, 13h49

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