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 :

File dynamique, erreur NullPointeurException


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 69
    Points : 52
    Points
    52
    Par défaut File dynamique, erreur NullPointeurException
    Bonjour;
    J'ai pas mal de confusion sur les liens, autrement les pointeurs dans les files ou piles dynamique en java, j'ai consulté pas mal des docs ou des site internet j'ai tjrs des difficultés la dessus.
    En fait j'ai réalise une file dynamique mais j'ai du mal à l'executer, message d'erreur NullPointerException

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Exception in thread "main" java.lang.NullPointerException
    	at Cours.Filedyn.enfiler(Filedyn.java:10)
    	at Cours.Filedyn.main(Filedyn.java:32)
    FileDynamique:
    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
    package Cours;
     
    public class Filedyn {
     
    	static Noeud tete;
     
     
    	public static void enfiler(int valeur){
    		Noeud nouveau = tete;
    		//tete = tete.getSuivant();
    		while(nouveau.getSuivant()!=null){
    			nouveau = nouveau.getSuivant();
    		}
     
    		nouveau.setSuivant(tete);
     
    	System.out.println(nouveau);
    	}
     
    	public int defiler(int valeur){
    		Noeud enlever = this.tete;
    		this.tete =this.tete.getSuivant();
     
    		return enlever.getValeur();
    	}
     
     
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Filedyn f = new Filedyn ();
    				f.enfiler(20); 
    				f.enfiler(30);
    				f.enfiler(40);
    				f.enfiler(50);
    //Je me demade comment faire ici pour l'affichage, comme c'est pas un tableau
    //J'ai essayé un boucle for allant de 1 à 4 mais en vain.
     
    	}
     
    }
    Le Code du Noeud
    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
    package Cours;
     
    public class Noeud {
     
    	private int valeur;
    	private Noeud suivant;
     
    	public Noeud (int valeur){
     
    		this.suivant = null;
    		this.valeur = valeur;
    	}
     
    	public void setSuivant(Noeud suivant){
    		this.suivant = suivant;
    	}
     
    	public void setValeur(int valeur){
    		this.valeur = valeur;
    	}
     
    	public Noeud getSuivant(){
    		return suivant;
    	}
     
    	public int getValeur(){
    		return valeur;
    	}
    }
    Merci d'avance

  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 : 54
    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,

    Premièrement, enlève les static : l'attribut static tete est commun à toutes les instances de Filedyn. Si tu manipulais plusieurs instances, ça ferait n'importe quoi.

    Ensuite, le problème dans la méthode enfiler, c'est que la première fois, tete est null. Il faut traiter ce cas à part. En plus, tu ne fais rien de ton paramètre valeur : ça ne risque donc pas d'ajouter la valeur en fin de liste. Et pire, tu dis que la tête est le suivant du nouveau : la tête c'est la tête, elle doit rester en tête, le nouveau s'ajoutant à la fin. A moins que le but soit d'ajouter au début, et dans ce cas, il n'y aurait pas besoin de chercher le dernier.

    Le pseudo-code pour ajouter à la fin :
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    nouveau <- new Noeud(valeur)
    si tete est null alors
       tete <- nouveau
    sinon
       dernier <- tete
       tant que dernier.suivant n'est pas null
            dernier <- dernier.suivant
       fin tant que
       dernier.suivant <- nouveau
    fin si

    Le pseudo-code pour insérer au début :
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    premier = tete
    tete <- new Noeud(valeur)
    tete.suivant <- premier

    Par ailleurs, si ta méthode defiler a pour but de retirer l'élément correspondant au paramètre, ce n'est pas ce qu'elle fait : elle enlève toujours le premier et retourne sa valeur (le paramètre est ignoré).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    En fait c'est une file simplement chainée:


    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    nouveau <- new Noeud(valeur)
    si tete est null alors
       tete <- nouveau
    sinon
       dernier <- tete
       tant que dernier.suivant n'est pas null
            dernier <- dernier.suivant
       fin tant que
       dernier.suivant <- nouveau
    fin si

    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
     
    ///====================
    /**Comme c'est une file simplement chainée, et ce que ceci est correcte pour ajouter un element:**/
     
    Noeud nouveau = new noeud(valeur);
     
    if(tete ==0){
    tete = nouveau;
    } else{
     
    Maillon dernierNoeud = tete;
    while(dernierNoeud .getSuivant()!=null){
    dernierMaillon = dernierNoeud .getSuivant()
     
     
     
    }
    dernierMaillon.setSuivant(nouveau)
    }
    Et ce que ton pseudo code correspond à ça?

  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 : 54
    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
    Citation Envoyé par Khalfe Voir le message
    Et ce que ton pseudo code correspond à ça?
    Et bien oui et non. Enfin, oui, à peu de chose près.

    1. On teste si une variable contient null par if ( tete == null), pas par if (tete==0)
    2. Pourquoi ta classe Noeud s'appelle tout d'un coup Maillon lorsque tu déclares la variable dernier ?
    3. Pourquoi ta variable dernierNoeud change-t-elle elle aussi de nom en dernierMaillon ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2008
    Messages : 69
    Points : 52
    Points
    52
    Par défaut
    Merci desolé c'est une erreur qui s'est glissé
    Je corrige, je pense maintenant ça doit être correcte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Noeud nouveau = new Noeud(valeur);
     
    if(tete == null){
    tete = nouveau
    }else{
    Noeud dernier = tete;
     
    while(dernier.getSuivant()!=null){
    dernier =dernier.getSuivant()
    }
    dernier .setSuivant(nouveau)
    }
    Une autre question pour le cas d'une pile dynamique pour empiler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void empiler(int valeur){
    Noeud nouveau = Noeud(valeur);
    nouveau.setSuivant(tete);
    tete = nouveau;
    }
     
    //Pour depiler
    public int depiler(){
     
    Noeud nouveau = this.tete;
    this.tete = this.tete.getSuivant();
    return nouveau;
    }
    Une troisième question:
    C'est ma question principale, comment je dois faire pour tester c'ette file ou pile?
    Comme c'est pas un tableau, ou bien je dois le mettre dans un tableau dynamique de type vector ou ArrayListe?
    Exemple:
    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
     
    //Supposons que j'initialise un objet de ma classe file comme suit:
     
    File f = new File();
     
    ArrayList<Object>Liste = new Liste<Object>();
    Liste.add(f.enfiler(15));
    Liste.add(f.enfiler(12));
    Liste.add(f.enfiler(20));
    Liste.add(f.enfiler(30));
     
     
    for(int i=0; Liste.size(); i++){
    Syste.out.println(Liste(i));
    }
    C'est code est il correcte?

  6. #6
    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 : 54
    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
    Citation Envoyé par Khalfe Voir le message
    Une autre question pour le cas d'une pile dynamique pour empiler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void empiler(int valeur){
    Noeud nouveau = Noeud(valeur);
    nouveau.setSuivant(tete);
    tete = nouveau;
    }
     
    //Pour depiler
    public int depiler(){
     
    Noeud nouveau = this.tete;
    this.tete = this.tete.getSuivant();
    return nouveau;
    }
    Elle est où la question ? Parce que je ne vois qu'un code, là... Si la question est "Est-ce correct ?", alors la réponse est oui pour la méthode empiler. La méthode depiler est presque juste :
    1. le premier problème est que son retour est un int, pas un Noeud : tu dois donc faire return nouveau.getValeur();
    2. le second problème est moins important : il faut que tu penses que ta pile peut-être vide, et que dans ce cas, ça fera une NullPointerException, alors qu'il vaudrait mieux que ça fasse une java.util.NoSuchElementException


    Citation Envoyé par Khalfe Voir le message
    Une troisième question:
    C'est ma question principale, comment je dois faire pour tester c'ette file ou pile?
    Comme c'est pas un tableau, ou bien je dois le mettre dans un tableau dynamique de type vector ou ArrayListe?
    Et bien ça dépend, si tu veux faire du vrai test (avec JUnit), ou si c'est juste pour montrer rapidement que ça fait le job (donc à la main on va dire).

    Citation Envoyé par Khalfe Voir le message
    Exemple:
    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
     
    //Supposons que j'initialise un objet de ma classe file comme suit:
     
    File f = new File();
     
    ArrayList<Object>Liste = new Liste<Object>();
    Liste.add(f.enfiler(15));
    Liste.add(f.enfiler(12));
    Liste.add(f.enfiler(20));
    Liste.add(f.enfiler(30));
     
     
    for(int i=0; Liste.size(); i++){
    Syste.out.println(Liste(i));
    }
    C'est code est il correcte?
    Bon là, non, et ce n'est pas un problème de test ou pas :
    • la méthode enfiler ne retourne pas de résultat, donc impossible de l'ajouter dans une liste ou autre chose ;
    • on accède pas à un élément de liste, par des parenthèses, mais pas un appel de méthode (en l'occurence la méthode get()).


    Maintenant, pour répondre à ta question :
    1. pour faire des tests JUnit il faut faire en général des classes plus complètes, car il faut au moins asserter une égalité avec quelque chose d'attendu : on ajoute des éléments dans la liste chainée et on teste si elle est égale à quelque chose qui est ce qu'on sait ce que ça devrait être. Et là, ce n'est jamais évident, et il te faudra ajouter des méthodes un minima.
    2. pour faire des pseudos tests pour voir si ça marche ce qu'on a écrit, souvent, le plus simple, c'est d'intégrer juste une méthode toString() qui affiche ce qu'on veut sous une forme qui nous permet de vérifier rapidement de visu que ça ne fait pas n'importe quoi.
      Par exemple :
      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
      public class File {
       
      	private Noeud tete;
       
       
      	public void enfiler(int valeur){
                    /*...*/
              }
       
              public int defiler() {
                   /*...*/
              }
       
              public String toString() {
                 if ( tete==null ) {
                      return "Vide";
                 }
                 StringBuilder sb = new StrinbBuilder();
                 Noeud premier = tete;
                 do {
                     sb.append("->");
                     sb.append("(");
                     sb.apppend(premier.getValeur());
                     sb.append(")");
                     premier = premier.getSuivant();
                 } while( premier!=null );
                 return sb.toString();
              }


    Bien sûr, si on se plante dans l'écriture de la méthode toString(), on peut afficher aussi n'importe quoi et penser qu'on a fait une erreur dans enfiler ou defiler, mais c'est facile à déboguer toString(), plus que les deux autres, et, en tout cas, on a une probabilité très très faible qu'on se trompe au point que toString() nous fasse croire que enfiler et defiler fonctionne, alors que ce n'est pas le cas (sauf si on le fait exprès).

    Et donc, si tu écris ton main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    File f = new File();
     
     
    int[] valeurs = {15,12,20,30};
     
    for(int valeur : valeurs) {
     
        System.out.println("Avant  ajout " + valeur + " : " + f);
        f.enfiler(valeur);
        System.out.println("Après ajout " + valeur + " : " + f);
     
    }
    Tu devras voir s'afficher :
    Avant ajout 15 : vide
    Après ajout 15 : ->(15)
    Avant ajout 12 : ->(15)
    Après ajout 12 : ->(15)->(12)
    Avant ajout 20 : ->(15)->(12)
    Après ajout 20 : ->(15)->(12)->(20)
    Avant ajout 30 : ->(15)->(12)->(20)
    Après ajout 30 : ->(15)->(12)->(20)->(30)
    
    Ce qui est déjà pas mal comme test. Ensuite, pour tester plus en détail, on pourra utiliser le débogueur en pas à pas.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. dbcontrol file recreate - erreur
    Par morb3002 dans le forum Administration
    Réponses: 0
    Dernier message: 10/06/2009, 19h58
  2. Bouton Dynamique Erreur
    Par Louison dans le forum ASP.NET
    Réponses: 7
    Dernier message: 24/04/2009, 15h10
  3. [E-07] Tableau croisé dynamique - Erreur n°5
    Par Mxwell dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/01/2009, 10h12
  4. TabSheet créé dynamiquement erreur d'acces
    Par cbegood dans le forum Débuter
    Réponses: 11
    Dernier message: 03/11/2008, 14h29
  5. Formulaire dynamique : Erreur 29054
    Par Secco dans le forum VBA Access
    Réponses: 4
    Dernier message: 30/06/2008, 09h53

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