web-dev-qa-db-ja.com

Javaエラー-不正なソースファイル:ファイルにクラスxが含まれていません。削除するか、表示されることを確認してください

最近Java試験のために勉強を始めました。

パッケージの学習中にこれを試してみると、エラーメッセージが表示されました。私がしたことは、


    //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();
        }
    }

私はこれらのファイルを両方とも「JavaTest」(Windows 7)と呼ばれるディレクトリに置き、最初にコマンドjavac -d . A.Javaを使用してA.Javaをコンパイルしました

そして、App.Javaをコンパイルしようとすると、次のエラーメッセージが表示されました。


    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

ただし、問題は2つの方法で解決するようです。

  1. ソースファイルA.Javaの削除
  2. ファイル「App.Java」のインポート文をimport com.test.helpers.*;からimport com.test.helpers.Aに変更します。

ここで何が起こるか説明していただければ幸いです。または私は間抜けな人間の間違いや構文エラーをしているかもしれません。

これはソースファイルへのリンクです

どうもありがとうございました

8
user3210872

フォルダーJavaTestの下のA.Javaをcom/test/helpersに移動します。表示されているエラーは、A.Javaがそのパッケージ宣言と一致しないフォルダーにあるとコンパイラーが不平を言っているためです。パッケージ内にAがないと、アプリからAにアクセスできないことに注意してください。

src driectoryの下から次のコマンドを実行してクラスをコンパイルします

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

次に、srcフォルダの下から

src>Java App

これでプログラムが実行されます。

5
Chandru

こんにちは、ここでの問題は、両方のディレクトリ(ambiguousおよびcom.test.helpersディレクトリ)のJavaTestクラスファイル名が原因で、JVMがクラスファイルを混乱させることです。

javac -d . A.Javaを実行すると、コンパイラはcom.test.helpersディレクトリにクラスファイルを作成し、JavaTestにあるソースファイルと混同します。

  1. Deleting the Source file A.Java

ソースファイルA.JavaJavaTestから削除すると、JVMはcom.test....のクラスファイルが使用されることを認識し、あいまいさがなくなります。

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

ここで、クラスの実装で使用する特定のファイルを指定しています。つまり、JavaTestパッケージではなくA.Javaからのファイルcom.test...を使用するようコンパイラーに指示しています

さて、このあいまいさの解決策が問題になることはありません。特定のファイルをインポートステートメントでインポートする必要があります。つまり、import com.test.helpers.A;またはimport com.test.helpers.*;を実行する場合は、com.test.helpers.AAの代わりに、現在のクラス実装のすべての場所で、コンパイラにJavaTestのソースと混同しないように指示します

私はこの特定の答えにはかなり遅れていることを知っていますが、今後の読者に私の見解を共有したいと思いました。何らかの形で彼らを助けることができれば、それは素晴らしいことです。ありがとう!

2
mohitR0_0

Javaは、ヘルパーフォルダにA.Javaファイルを置くように要求しません

a.Javaファイルを削除してコードを実行した理由は、app.Java(またはメインのJavaファイルに他のクラスをインポートしている場合)、-> )はデフォルトのパッケージにあり、クラスをインポートする際に、パッケージディレクトリではなく同じディレクトリを優先します(クラスファイルと同じ名前のファイルが存在する場合->これがエラーのあるソースファイルです。 A.Java->必要に応じてA.class)

そして、そのため、Javaにルールがあります。それは、パッケージと並行して(同じ名前の).Javaファイルを配置することはありません。

この問題を解決するには、ファイルA.Javaを削除するか、ファイル名を変更する(パッケージに存在しない他の名前に変更する)か、完全修飾インポートステートメントを使用する必要があります。

1
user6735558

ファイルA.JavaはパスJavaTest\com\test\helpers\A.Javaにある必要があります

次のようにコンパイルすることを忘れないでください:javac -d。 com\test\helpers\A.Java

1
jambriz

やっと同じ問題が

解決しました。

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

com.test.helpersにクラス以上がある場合、uはimport com.test.helpers。*;を使用できます