web-dev-qa-db-fra.com

Erreur Java - fichier source incorrect: le fichier ne contient pas la classe x. S'il vous plaît supprimer ou assurez-vous qu'il apparaît

Récemment commencé à étudier Java pour un examen.

Tout en apprenant les paquets, j'ai essayé et obtenu un message d'erreur. Ce que j'ai fait était


//Creating class A (Within package the package: com.test.helpers)

package com.test.helpers;
public class A {
    public void sayHello(){
        System.out.println("Hello World");
    }
}

//And then the class App utilizing the class A

import com.test.helpers.*;

public class App{
    public static void main(String args[]){
        A a = new A();
        a.sayHello();
    }
}

J'avais ces deux fichiers dans un répertoire appelé 'JavaTest' (sous Windows 7) et j'ai d'abord compilé A.Java à l'aide de la commande "javac -d. A.Java"

Et puis, en essayant de compiler App.Java, j'ai reçu le message d'erreur suivant:


App.Java:5: error: cannot access A
                A a = new A();
                ^
  bad source file: .\A.Java
    file does not contain class A
    Please remove or make sure it appears in the correct subdirectory of the source path.
1 error

Cependant, le problème semble résoudre de deux manières,

  1. Suppression du fichier source A.Java
  2. Modification de l'instruction d'importation de 'import com.test.helpers. *;' importer 'com.test.helpers.A' dans le fichier 'App.Java'.

Je vous serais très reconnaissant si vous pouviez expliquer ce qui se passe ici. Ou je pourrais faire une erreur humaine maladroite ou une erreur de syntaxe.

Voici le lien vers les fichiers source

Merci beaucoup

6
user3210872

déplacez A.Java sous le dossier JavaTest vers com/test/helpers. L'erreur que vous voyez concerne le compilateur qui se plaint qu'A.Java se trouve dans un dossier qui ne correspond pas à sa déclaration de package. N'oubliez pas que vous ne pouvez pas accéder à A à partir de l'application sans que A soit dans un package.

sous src driectory, exécutez la commande suivante pour compiler vos classes

src> javac ./*.Java ./com/test/helpers/*.Java

puis sous le dossier src

src>Java App

cela devrait exécuter votre programme.

5
Chandru

tout est à la bonne place, Java ne demande pas de mettre votre fichier A.Java dans le dossier helpers

la raison principale pour laquelle votre code a été exécuté avec le fichier A.Java supprimé et non autrement est: lorsque votre app.Java (ou le fichier Java principal qui importe d'autres classes, ->) est dans un package par défaut, puis lors de l'importation les classes, il donne la priorité au même répertoire et non au répertoire du paquet (s’il existe un fichier portant le même nom que le fichier de classe -> et c’est pourquoi il génère une erreur. Le fichier source est incorrect A.Java -> .classe)

Et à cause de cela, il existe une règle en Java: Ne jamais placer un fichier .Java (du même nom) en parallèle des packages.

aussi, pour résoudre ce problème, vous devez soit supprimer le fichier, A.Java, soit le renommer (en n’importe quel autre nom ne figurant pas dans le package), soit utiliser une instruction d’importation complète.

1
Prashant Kr.

Bonjour, le problème est que la JVM confond le fichier de classe en raison du nom du fichier de classe ambiguous dans le répertoire (le répertoire JavaTest ainsi que le répertoire com.test.helpers).

quand vous faites javac -d . A.Java, le compilateur crée un fichier de classe dans le répertoire com.test.helpers et le confond maintenant avec le fichier source dans JavaTest

  1. Deleting the Source file A.Java

Lorsque vous supprimez le fichier source A.Java de JavaTest, JVM sait maintenant que le fichier de classe dans com.test.... doit être utilisé, l'ambiguïté disparaît.

  1. Changing the import statement from 'import com.test.helpers.*;' to 'import com.test.helpers.A' in the file, 'App.Java'.

Ici, vous spécifiez le fichier particulier à utiliser dans votre implémentation de classe, c'est-à-dire que vous demandez au compilateur d'utiliser le fichier A.Java à partir de com.test... et non à partir du package JavaTest.

Maintenant, la solution pour que cette ambiguïté ne soit plus jamais un problème pour vous, vous devez importer les fichiers spécifiques avec la déclaration d'import c.-à-d. import com.test.helpers.A; ou si vous souhaitez effectuer import com.test.helpers.*;, vous devez utiliser spécifiquement com.test.helpers.A à la place de A partout dans votre implémentation de classe actuelle. dire au compilateur de ne pas le confondre avec la source à JavaTest

Je sais qu'il est beaucoup tard pour cette réponse particulière, mais je voulais partager mon point de vue pour les lecteurs à venir. Si cela pouvait les aider de quelque manière que ce soit, ce serait génial. Merci!

1
mohitR0_0

le fichier A.Java doit se trouver dans le chemin JavaTest\com\test\helpers\A.Java

et n'oubliez pas de le compiler comme ceci: javac -d. com\test\helpers\A.Java

1
jambriz

J'ai le même problème finalement,

J'étais résolu.

//Use like this
import com.test.helpers.A;

Si vous avez une classe supérieure à com.test.helpers , vous pouvez utiliser import com.test.helpers. *;

1
Shivanandam