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 :

Erreur de compilation


Sujet :

avec Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Erreur de compilation
    Bonjour à tous,

    J'essaie de programmer une sorte de calculatrice pour les moyenne avec coef. Il faut qu'elle soit très simple d'utilisation alors j'ai fait en sorte de demander qu'un copié collé des notes (toutes a la fois et avec les coef entre parenthèses) il déduis le nombre de note grace au nombre d'espaces et le programme isole ensuite la partie correspondant à la note et la met dans un tableau, la note est ensuite analysée et sépare le coef de la note (et supprime les parenthèses) et met ensuite la partie note avec le coef correspondant dans un tableau bidimensionnel (si il n'y a pas de parenthèses alors le coef est 1).
    Je modifie le tout en "double".
    Apres ca le calcul pour faire la moyenne fait appel aux tableaux et la selon les modifications je tombe sur
    NullPointerException
    ou sur:
    Exception in thread "main" java.text.ParseException: Unparseable number: ""
    (c'est due a la conversion en double qui s'effectue mal car la dernière note n'est pas incrite dans la derniere place du tableau)

    Mettez-y dans votre compilateur vous visualiserai mieux l'erreur:

    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
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    package apprentissage;
     
    import java.text.NumberFormat;
    import java.text.ParseException;
    import java.util.Scanner;
     
    /**
     *
     * @author Toto
     */
    public class Apprentissage {
        private static double[][] cor;
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws ParseException {
            // TODO code application logic here
     
            Scanner sc = new Scanner(System.in);
            double ct = 0, nc = 0, m;
            int i= 0, nn = 0, x = 0;
            System.out.println("rentrez notes:" );
            String notes = sc.nextLine();
            nn = defininbr(notes);
     
           do
            {
                double cor1[][] = séparenote(notes, nn); 
                double n = cor1 [0][x];
                double c = cor1 [1][x];
     
                ct = ct + c;
                nc = nc + n * c;
                i++;
                x++;
            }while(i < nn);
           m = nc / ct;
           System.out.println("votre moyenne est: "+m);
     
     
     
     
     
     
     
     
     
     
    }
        public static int defininbr (String notes) { 
            int nn;
           int a = 0, b = 0, c, d;
     
     
    do{
     
    a = notes.indexOf("   ", a+1);         //les trois espaces correspondent à un site qui sépare les notes par 3 espaces tout simplement.
    b++;
    }while (a != -1);
     
    nn = b;
           return nn; 
        }
     
     
     
     
        public static double[][] séparenote (String notes, int nn) throws ParseException{
     
            int a = 0, b = 0, b2 = 0,  c, d = notes.length(), a2 = 0;
    int Indexnote [][] = new int [2][nn];
     
    do{
    a = notes.indexOf("   ", a+1);      //je cherche l'index de l'espace apres note
    b = notes.lastIndexOf(" ", a-1);     // je cherche l'index de l'espace avant la note
     
    Indexnote [0][a2] = b+1;
    Indexnote [1][b2] = a;
    a2++;                              //j'incrémente la valeur de la place dans le tableau
    b2++;
     
    }while(a2<nn-1);                     //nbr de note
    a = notes.length();      
    b = notes.lastIndexOf(" ", a-1);
    Indexnote [0][a2] = b+1;
    Indexnote [1][b2] = a;
     
    /*
     * on converti les données en index de la partie note
     */
    String partienote [] = new String [nn];  
    a2 = 0;
    b2 = 0;
    a = 0;
    String g;
     
    do{
    partienote [a] = notes.substring(Indexnote[0][a2], Indexnote[1][b2]); 
    a2++;
    b2++;
    System.out.println(""+partienote[a]);
    a++;
    }while(a<nn);
     
    int l = 0;
     
    do{
    int p = partienote[l].indexOf("(");
    double cor1 [][] = new double [2][nn];
                                //à incrementer pour les différentes notes
        NumberFormat monFormatteurDeNombre = NumberFormat.getInstance();
    if(p == -1){
     
    cor1 [0][l] = monFormatteurDeNombre.parse(partienote[l]).doubleValue();
    cor1 [1][l] = 1;
    }
    else if(p != -1){
     
    cor1 [0][l] = monFormatteurDeNombre.parse(partienote[l].substring(0, p)).doubleValue();
    String cf = (partienote[l].substring(p+1, partienote[l].length()));
    cor1 [1][l] = monFormatteurDeNombre.parse(cf).doubleValue();
    }
    System.out.println(""+cor1 [0][l]+"("+cor1 [1][l]+")");
    l++;
    }while(l <=nn);
     
       return cor; 
    }
    }
    Si vous voyez où est l'erreur expliquez la moi parce que la je cale

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    c'est une bonne intention de faire des programmes simples à utiliser, mais déjà je trouve pas vraiment simple de deviner qu'il faut séparer les notes de trois espaces : à la limite si tu pouvais mettre dans ton post un exemple de saisie à defaut d'une doc utilisateur, ce serait sympa.

    ensuite, le programme lui même pourrait être nettement plus simple. ça t'aiderais à comprendre ce qui ne va pas

    pour les exceptions, déjà la trace te donne pas mal d'info (et la stacktrace est au moins aussi utile le message, ça permet de connaitre l'endroit ou l'erreur a lieu).
    pour comprendre l'erreur, tu peux ajouter des traces (System.out.println(...)). ensuite le mode debug permet de résoudre ce genre de problème si les traces ne sont pas suffisantes.

    donc j'ai essayé ton prog en entrant :

    12 15 5

    j'ai déjà une première erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    	at Apprentissage.séparenote(Apprentissage.java:109)
    	at Apprentissage.main(Apprentissage.java:24)
    la ligne correspond à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int p = partienote[l].indexOf("(");
    l'erreur est due à cette condition (ligne 126) :
    puisqu'en 92 tu déclares un tableau de taille nn ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String partienote [] = new String [nn];
    ça plante quand l==nn

    donc j'ai remplacé la ligne 126 par :

    je relance le prog, avec la même entrée

    j'obtiens :

    Exception in thread "main" java.lang.NullPointerException
    at Apprentissage.main(Apprentissage.java:30)

    peut être l'erreur NullPointerException dont tu parles

    la ligne qui pose problème c'est
    en effet, en ajoutant une trace, on voit que cor1 est null

    je cherche ou est déclarée et initialisée cor1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double cor1[][] = séparenote(notes, nn);
    donc je regarde la méthode séparenote, et là je vois qu'elle se termine par

    cor une variable static de la classe Apprentissage que tu déclares mais que tu initialises nulle part : normal qu'il y ait null dedans

    je m'arrête là parce que je sais pas trop ce que tu voulais y mettre.

    sinon j'obtiens l'autre exception :
    Exception in thread "main" java.text.ParseException: Unparseable number: ""

    seulement si je mets 4 espaces au lieu de 3 entre 2 notes

    ce qui tenterait à montre que cette histoire de 3 espaces ne soit pas une bonne idée

    je ne sais pas trop ce que tu cherches à faire avec cet histoire de 3 espaces, mais pourquoi tu cherches à limiter le nombre d'espaces à 3 ?
    si ta saisie était une suite de nombres, sans parenthèse, ou avec parenthèse, avec un nombre d'espace quelquonques : ça marcherait dans tous les cas, sans cette contrainte forte problèmatique

    genre on pourrait saisir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         12          14(2) 5   13    (4)           8 18 (    2)           14(2  )
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12    14(2)   5   13(4)   8   18(2)   14(2)
    marcherait aussi

    si cette chaine est parsée correctement à fortiori une chaine avec 3 espaces à chaque fois marche aussi.

    ensuite tu peux opter pour 3 solutions pour parser :

    - à base de String.split(" ") ou de StringTokenizer
    - à base indexof(" ",index),
    - à base d'un for, de String.charAt(index); d'un StringBuilder, et d'un booléen pour savoir si tu est entre parenthèse ou pas (la solution que je préfère perso) : en créant une classe Note le parsage est ultra simple

    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
    public class Note {
     
         private double note;
         private double coef;
     
         public Note() {
             this.coef=1;
         }
     
         public void setNote(double note) {
              this.note=note;
         }
     
         public double getNote() {
              return note;
         }
     
         public void setCoef(double coef) {
              this.coef=coef;
         }
     
         public double getCoef() {
              return coef;
         }
     
         public String toString() {
    	    	return note+" ("+coef+")";
         }
     
    }
    pour le parsing :

    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
    public static Note[] parseNotes(String notes) {
     
         List<Note> listNotes=new ArrayList<Note>();
     
    	     if (notes!=null && notes.length()>0) {
     
    	         StringBuilder sb=new StringBuilder();
     
    	         Note note=null; // note en cours de lecture
    	         boolean entreparenthese=false; //indique quand on est entre parenthèse
    	         for(int index=0; index<notes.length(); index++) {
    	             char c=notes.charAt(index);
    	             switch(c) {
    	                case '(':
    	                    if (entreparenthese) {
    	                        // on a deux parenthèses ouvrantes qui se suivent sans parenthèses fermante entre les deux
    	                        throw new IllegalArgumentException("erreur dans la chaine siasie: manque )");
    	                    }
    	                    else if (note==null) {
    	                    	// coef sans note
    	                        throw new IllegalArgumentException("erreur dans la chaine siasie: note manquante");
    	                    }
    	                    else {
    	                    	if ( sb.length()>0 ) {
    			                       // il y a un nombre dans le buffer
    			                    	  // c'est forcément une note
    		                    	  note=new Note();
    		                    	  listNotes.add(note);
    		                    	  note.setNote(Double.parseDouble(sb.toString()));
    		                    	  sb.setLength(0);//on remet le buffer zéro 
    		                	}
    	                    	entreparenthese=true;
    	                    }
    	                    break;
    	                case ' ':
    	                   if ( sb.length()>0 ) {
    	                       // il y a un nombre dans le buffer
    	                      if ( entreparenthese ) {
    	                    	  // c'est un coef
    	                    	  note.setCoef(Double.parseDouble(sb.toString()));
    	                    	  sb.setLength(0);//on remet le buffer zéro 
    	                      }
    	                      else {
    	                    	  // c'est une note
    	                    	  note=new Note();
    	                    	  listNotes.add(note);
    	                    	  note.setNote(Double.parseDouble(sb.toString()));
    	                    	  sb.setLength(0);//on remet le buffer zéro 
    	                      }
    	                   } 
    	                   break;
    	                case ')':
    	                	// on ferme une parenthèse
    	                	if ( sb.length()>0 ) {
    		                       // il y a un nombre dans le buffer
    		                      if ( entreparenthese ) {
    		                    	  // c'est un coef
    		                    	  note.setCoef(Double.parseDouble(sb.toString()));
    		                    	  sb.setLength(0);//on remet le buffer zéro 
                                              note=null; // on a plus rien à mettre dans la note (on a une note et un coef)
    		                      }
    		                      else {
    		                    	  // c'est une erreur : on a pas ouvert la parenthèse
    			                        throw new IllegalArgumentException("erreur dans la chaine saisie: manque (");
    		                      }
    	                	}
    	                	entreparenthese=false; // on ferme la parenthèse
    	                	break;
    	                default:
                           if ( Character.isDigit(c) ) {
                        	   sb.append(c);
                           }
                           else if ( c=='.' || c==',' ) {
                        	   // on trait les points et les virgules
                        	   if ( sb.indexOf(".")>=0 ) {
                        		   // il y a plusieurs virgules dans le nombre !!!
    		                        throw new IllegalArgumentException("erreur dans la chaine saisie: nombre incorrect "+sb+c);
                        	   }
                        	   sb.append('.'); // on ajoute toujours un . parce qu'on parse les double avec Double.parseDouble(x)
                           }
                           else {
                        	   // caractère incorrect: ni une espace, ni un chiffre, ni parenthèse, ni virgule, ni point
    	                        throw new IllegalArgumentException("erreur dans la chaine saisie: caractère incorrect: "+c);
                           }
    	             }
    	         }
    	         if ( sb.length()>0 ) {
                     // il y a un nombre dans le buffer
    	        	 if( entreparenthese ) {
    	        		 // on a pas fermé la dernière parenthèse
                         throw new IllegalArgumentException("erreur dans la chaine siasie: manque )");
    	        	 }
                  	  // c'est forcément une note
    	          	  note=new Note();
    	          	  listNotes.add(note);
    	          	  note.setNote(Double.parseDouble(sb.toString()));
    	         }
     
     
    	     }
     
                 // on retourne le résultat sous forme de tableau
    	     return listNotes.toArray(new Note[listNotes.size()]);
     
    }
    exemple d'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void main(String[] args) {
     
    		String s="     12          14(2) 5   13.5    (4.5)           8 18.5 (    2)           14(2   )";
     
    		Note[] notes = parseNotes(s);
     
    		System.out.println(Arrays.toString(notes));
     
    	}
    qui donne en résultat :
    [12.0 (1.0), 14.0 (2.0), 5.0 (1.0), 13.5 (4.5), 8.0 (1.0), 18.5 (2.0), 14.0 (2.0)]

    maintenant, à partir du tableau résultat, tu es en mesure de calculer tout ce que tu veux, moyenne, écart type, etc...

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double totalcoef=0;
    double total=0;
    for(Note note:notes) {
         total+=note.getNote()*note.getCoef();
         totalcoef+=note.getCoef();
    }
    System.out.println("Moyenne ; "  + Math.round(total/totalcoef));
    tu peux ajouter aussi des tests dans la classe Note, pour tester si tes notes sont bien comprises entre 0 et 20, si le coef n'est pas 0, etc...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut re
    Merci à toi Joel ça va m'être très utile et je peux te dire que tu m'as appris des choses, en effet je suis plutôt débutant alors y'a certaine choses que je regarderai plus tard mais je vais essayer de comprendre un maximum de choses histoire de ne pas redemander la même chose la prochaine fois.

    encore merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    correction du bug
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. Réponses: 2
    Dernier message: 23/09/2003, 14h32
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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