Erreur dans le code java

Fermé
mm - 9 juin 2012 à 21:32
 mm - 10 juin 2012 à 16:53
Bonjour,
je suis entrain de développer une application en java sous eclipse j'ai un problème dans la méthode bintToDec qui permet de convertir un nombre binaire en un nombre décimale j'ai pas compris l'erreur voilà la méthode :
public int binToDec(String ch){
int p = 1;
int s = 0;


for (int i = ch.length(); i > 0; i--)
{
int x =Integer.valueOf(ch.charAt(i));
s = s+x*p ;
p =p*2;
}

System.out.println(s+"???????????????????????");
return s;
}
************
l'erreur :
Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 7
at java.lang.String.charAt(String.java:558)
at Regle.binToDec(Regle.java:157)
at Regle.toString_verif(Regle.java:237)
at fenetre.jButtonVerifier(fenetre.java:249)
at fenetre$14.actionPerformed(fenetre.java:1033)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:5517)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
at java.awt.Component.processEvent(Component.java:5282)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3984)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3819)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1791)
at java.awt.Component.dispatchEvent(Component.java:3819)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)





A voir également:

1 réponse

bubull97 Messages postés 133 Date d'inscription vendredi 1 octobre 2010 Statut Membre Dernière intervention 19 février 2014 10
9 juin 2012 à 22:08
Salut,

Essaye en commencant à partir de "i-1"

int i = ch.length() -1;
for (; i > 0; i--)
{
int x =Integer.valueOf(ch.charAt(i));
s = s+x*p ;
p =p*2;
}

OU

Je sais pas quel est ton niveau en programmation, mais
"int x =Integer.valueOf(ch.charAt(i));"
peut retourner une exception (sans certitude)
Donc il faut gerer l'exception
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
9 juin 2012 à 22:30
Effectivement il faut commencer à i-1, mais on doit aussi s'arrêter à 0 inclus.

for (int i=ch.length()-1; i>=0; i--)

"Integer.valueOf(ch.charAt(i)); peut retourner une exception (sans certitude)"
En effet, ce sera dans le cas où i n'est pas dans l'intervalle (problème que l'on vient de régler) ou alors si ch ne contient pas que des chiffres. On peut aussi avoir le cas où ch vaut null, mais dans ce cas le programme aura planté avant (lors du ch.length par exemple)
0
oui je comprend mais j'ai essayer avec ça mais c'est pas juste :
public int binToDec(String ch){
try{
int p = 1;
int s = 0;


for (int i=ch.length()-1; i>=0; i--)
{
int x =Integer.valueOf(ch.charAt(i));
s = s+x*p ;
p =p*2;
}

System.out.println(s+"???????????????????????");
}
catch(IOException err){
err.getMessage();
}
return s;

}
est ce que vus pouvez m'aider svp et merci d'avance
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
9 juin 2012 à 23:19
catch(IOException err) ???
Il n'y a aucune raison d'avoir une erreur sur les fichiers vu ce que tu fais !

Dans ton cas, la gestion d'exception n'est pas utile, s'il y en a une c'est que l'utilisateur a fait une faute grave, il vaut mieux la laisser se propager, plutôt que faire une récupération inutile qui va masquer l'exception (car err.getMessage() ne vas rien faire), et laisser tourner le programme alors que le résultat renvoyé sera faux puisque le calcul aura été incomplet !
En plus quand on ne les maîtrises pas, on commet des erreurs inutiles comme lorsque tu fais "return s" en dehors du try, alors que "s" y est déclaré à l'intérieur...

Normalement comme ceci, il ne devrait pas y avoir d'erreur de compilation :

public int binToDec(String ch)
{
    int p = 1;
    int s = 0;
    
    for (int i=ch.length()-1; i>=0; i--)
    {
        int x = Integer.valueOf(ch.charAt(i));
        s = s+x*p;
        p = p*2;
    }
    
    return s;
}

Je n'ai pas testé pour savoir si ça faisait ce que tu voulais, mais ça semble pas trop mal...
0
oui c'est bon mais se n'est pas le calcul juste car j'ai essayer avec ch = 1010000 il m'affiche 6176 au lieu de 80
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
9 juin 2012 à 23:57
L'erreur vient de ch.charAt(i), qui prend en compte les valeurs des caractères '0' et '1' qui valent 47 et 48
Tu dois donc soustraire cette valeur à chaque fois, par exemple en faisant :

int x = ch.charAt(i)-'0';
0