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

Langage Java Discussion :

NoclassDefFoundError classe main [debutant]


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut NoclassDefFoundError classe main [debutant]
    Salut à tous,
    ça a l'air d'une exception simple, mais j'arrive pas à la résoudre.
    quand je compile ma classe java sur Eclipse, j'ai une exception de type:NoclassDefFoundError
    j'ai bien vérifié la classpath, c'est bon.
    mon code contient bien une méthode main qui sert d'entrée du programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void main (String args){
     
        try {
            ArrayList test = new ArrayList();               
            BufferedReader lecteur = new BufferedReader(new FileReader("C:/data.txt"));
            ........
    }
    je comprends pas

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par flora806 Voir le message
    je comprends pas
    Moi non plus : puisque tout est correct cela devrait marcher...


    ...



    Si tu ne donnes pas plus d'informations personne ne pourra t'aider :
    • Quel est ton arborescence ?
    • Que comporte ton classpath ?
    • Quelle ligne de commande tu utilises pour ton application ?



    a++

  3. #3
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Moi non plus : puisque tout est correct cela devrait marcher...
    Coucou,

    Non tout n'est pas correct à vrai dire.

    Ta fonction main doit être déclarée en static, pour pouvoir être appelée sans devoir instancier la classe qui la contient.

    Cordialement

    Fred

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour.
    En continuant sur cette voie, y'a aussi la signature de main qui est incorrecte, il faut mettre String[] au lieu de String.

    Bonne chance.

  5. #5
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut
    Ta fonction main doit toujours être déclarée de la façon suivante. Et pour pouvoir utiliser le BufferReader, il faut faire un import (je suppose que tu l'as fait, mais je le précise quand même )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import java.io.*;
    public static void main (String[] args){   
        try {
            ArrayList test = new ArrayList();               
            BufferedReader lecteur = new BufferedReader(new FileReader("C:/data.txt"));
            ........
    }
    Edit: grillé sur la dernière correction...

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Bonjour à tous,
    je viens de rajouter "static" à ma déclaration de méthode main et String []:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     public static void main (String[] args) {             
        try {
             ArrayList <String> temp = new ArrayList <String>();
              BufferedReader lecteur = new BufferedReader(new FileReader("C:data.txt"));
            String ligne;
              while ( (ligne=lecteur.readLine())!=null )  {
                temp.add(ligne);
                this.ncol = Math.max(this.ncol,ligne.split(" ").length);
    .....
    ...........}
    mon fichier contient des entiers sur plusieurs lignes,je fais une lecture de ligne, je veux spécifier après les lignes et les colonnes et quand j'utilise "this", mon compilateur n'accepte pas parce que ce n'est pas utilisé dans un contexte "static"
    je fais comment à votre avis
    Merci..

  7. #7
    Membre confirmé Avatar de fisico
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Par défaut
    "this" référe à l'instance courante... quelque chose qui est static ne fait pas référence une instance, c'est qqch qui est commun à toutes les instances. Il te manque des bases là en Java.

    Fais des recherches sur static au cas où...

  8. #8
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    je viens de lire une doc sur le sujet, je sais que static n'est pas liée à une instance de classe..alors que "this" représente une instance courante de la classe.
    Mais, je ne sais pas toujours comment réexprimer mon code et tou particulièrement la ligne:

    this.ncol = Math.max(this.ncol,ligne.split(" ").length);.....

    N.B: je suis encore débutante

  9. #9
    Membre confirmé Avatar de fisico
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Par défaut
    "ncol" vient d'où parce que dans ton code que tu as montré, on ne voit pas cette variable.

  10. #10
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    je vais remettre le code de tout à l'heure:
    ----------
    public static void main (String[] args) {
    try {
    ArrayList <String> temp = new ArrayList <String>();
    BufferedReader lecteur = new BufferedReader(new FileReader("C:data.txt"));
    String ligne;
    while ( (ligne=lecteur.readLine())!=null ) {
    temp.add(ligne);
    this.ncol = Math.max(this.ncol,ligne.split(" ").length);
    .....
    ...........}
    ------------
    donc quand je parse mon fichier , je veux créer après des colonnes et des lignes et ncol représente une variable.
    par quoi je pourrais remplacer le "this.ncol" sur la dernière ligne?
    Merciiiii pour ton aide.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2005
    Messages : 4
    Par défaut
    Perso, je dirai que ncol doit être déclaré comme un int avant ta boucle

  12. #12
    Membre confirmé Avatar de fisico
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Par défaut
    Merci pour le code mais où est la déclaration de ta variable ncol ?

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 966
    Par défaut
    Ok, résumé des bases en Java :
    Une classe est un "moule" d'après lequel sont formé tous les "objets". Réciproquement, tous les objets sont des "instances" de la classe.
    Le mot clé "this" désigne l'instance en cours.
    Le mot clé "static", devant une méthode, précise que cette méthode ne fait pas partie de chaque objet, mais est une méthode globale, pour tous les objets de cette classe.
    Employer this dans une méthode static, c'est désigner l'instance en cours alors que justement, il n'y a pas d'instance en cours. Un peut comme de demander où sont les roues non d'une voiture, mais de l'usine qui fabrique les voitures! La dernière fois que j'ai vérifié, les usines ne sont pas montées sur roues!

    Le problème n'est donc pas la syntaxe, mais bien votre modélisation : il ne s'agit pas d'une faute de langage, mais plutôt d'une phrase insensée.

    La bonne méthode :
    Dans la méthode main, il n'y a pas d'instance en cours. Hors, vous en voulez une. Le plus simple consiste à déplacer tout le code actuellement contenu dans main vers une méthode non statique. Dans la méthode main, créez une instance (via new) puis appelez la méthode contenant le code de l'application.

    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
     
    // les imports
     
    public class Application {
        // les variables
     
        static Application applicationInstance;
     
        private Application() {
            // initialisation
        }
     
        public static void main(String[] args) {
            Application.applicationInstance = new Application();
            Application.applicationInstance.runApplication(args);
        }
     
        private void runApplication(String[] args) {
            // code applicatif
        }
     
        private void finalize() {
            // fin de l'application, libération des ressources et tout ça
        }
    }
    runApplication peut contenir autant d'appels à this que vous voulez. Remarquez que le constructeur, le destructeur et la méthode runApplication de la classe application sont privés : il n'y a que la classe Application qui ait le droit de se lancer elle-même, lors de l'appel à main.

  14. #14
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Citation Envoyé par arctarus Voir le message
    Perso, je dirai que ncol doit être déclaré comme un int avant ta boucle
    c'est déja fait, j'ai déja déclaré:" int ncol".

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 230
    Par défaut
    Tu n'as donc plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ( (ligne=lecteur.readLine())!=null )  {
                temp.add(ligne);
                this.ncol = Math.max(this.ncol,ligne.split(" ").length);
                ....
    mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int ncol = 0;
    while ( (ligne=lecteur.readLine())!=null )  {
       temp.add(ligne);
       ncol = Math.max(ncol,ligne.split(" ").length);
       ....
    ?

  16. #16
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Citation Envoyé par BugFactory Voir le message
    Ok, résumé des bases en Java :
    Une classe est un "moule" d'après lequel sont formé tous les "objets". Réciproquement, tous les objets sont des "instances" de la classe.
    Le mot clé "this" désigne l'instance en cours.
    Le mot clé "static", devant une méthode, précise que cette méthode ne fait pas partie de chaque objet, mais est une méthode globale, pour tous les objets de cette classe.
    Employer this dans une méthode static, c'est désigner l'instance en cours alors que justement, il n'y a pas d'instance en cours. Un peut comme de demander où sont les roues non d'une voiture, mais de l'usine qui fabrique les voitures! La dernière fois que j'ai vérifié, les usines ne sont pas montées sur roues!

    Le problème n'est donc pas la syntaxe, mais bien votre modélisation : il ne s'agit pas d'une faute de langage, mais plutôt d'une phrase insensée.

    La bonne méthode :
    Dans la méthode main, il n'y a pas d'instance en cours. Hors, vous en voulez une. Le plus simple consiste à déplacer tout le code actuellement contenu dans main vers une méthode non statique. Dans la méthode main, créez une instance (via new) puis appelez la méthode contenant le code de l'application.

    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
     
    // les imports
     
    public class Application {
        // les variables
     
        static Application applicationInstance;
     
        private Application() {
            // initialisation
        }
     
        public static void main(String[] args) {
            Application.applicationInstance = new Application();
            Application.applicationInstance.runApplication(args);
        }
     
        private void runApplication(String[] args) {
            // code applicatif
        }
     
        private void finalize() {
            // fin de l'application, libération des ressources et tout ça
        }
    }
    runApplication peut contenir autant d'appels à this que vous voulez. Remarquez que le constructeur, le destructeur et la méthode runApplication de la classe application sont privés : il n'y a que la classe Application qui ait le droit de se lancer elle-même, lors de l'appel à main.
    -------------------------
    Merci pour toutes ces explications, ça été bien utile de me rappeler ces notions de base, je les ai suivi, et là je pense que je n'ai plus d'erreurs sur mon code
    j'ai par contre une autre question, j'utilise plusieurs méthodes dans mon appli:
    -méthode main: pour exécuter une instance de l'application
    -méthode pour parser le fichier et le charger sous un vecteur
    -d'autres méthodes pour faire un tas de calcul
    Donc là, quand je fais un Run, je n'ai que le résultat de parsing, comment je fais le lien avec les autres méthodes de calcul?
    Excusez mon niveau de débutant

  17. #17
    Membre confirmé Avatar de fisico
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Par défaut
    En appelant tout simplement les autres méthodes... euh question assez vague que tu as posée.

  18. #18
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Citation Envoyé par fisico Voir le message
    En appelant tout simplement les autres méthodes... euh question assez vague que tu as posée.
    je vais me réexpliquer:
    dans ma méthode main, j'instancie la méthode qui permet de parser le fichier (son nom est:RunApplication..). Ce fichier contient des lignes d'entiers qui correspondent à l'id de la personne, l'id de l'article et le prix..
    j'ai d'autres méthodes :
    public double pd(int personne, int art) {......} qui permet de faire des calculs sur ces entiers.
    et public double pr(int personne1, int personne2) qui fait des calculs en comparants 2 personnes..
    est-ce que je dois instancier ces 2 dernières méthodes à partir du main aussi?je dois spécifier les arguments?

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 966
    Par défaut
    Non non, on n'instancie pas les méthodes, mais les objets. La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.applicationInstance = new Application();
    instancie l'objet Application. (Plus exactement, l'objet de classe Application référencé par applicationInstance.) A partir de là, toutes les méthodes de Application sont disponibles.

    J'ai passé les arguments à runApplication, mais ce n'est pas une obligation, c'est simplement le cas le plus courant.

    Si vous voulez mon avis, on vous a enseigné le langage Java sans vous enseigner la programmation objet, ce qui est une énorme c... erreur. Vous devriez probablement lire un livre sur le sujet. Connaître le Java mais pas la programmation objet, c'est un peu comme d'essayer d'apprendre à piloter un avion sans savoir que ça sert à voler (ça finit toujours par un crash). Même si vous n'avez pas le temps pour ce projet, pensez-y par la suite.

  20. #20
    Membre confirmé Avatar de fisico
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Par défaut
    Oui c'est exactement cela, les bases de l'orienté objet ne sont pas là. Un petit livre ou tutoriel sera suffisant pour remédier à cela

Discussions similaires

  1. Réponses: 20
    Dernier message: 01/03/2011, 13h08
  2. [Debutant]Exception NoClassDefFoundError dans main
    Par Mystnux dans le forum Langage
    Réponses: 4
    Dernier message: 17/06/2006, 13h24
  3. [JAR]Création de Jar -> trouve pas la classe main
    Par Zapan dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 28/01/2006, 12h17
  4. Réponses: 15
    Dernier message: 29/12/2005, 11h32
  5. [ERREUR] Ne retrouve pas la classe main
    Par Anathema dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 06/07/2005, 17h16

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