複数ファイルのプログラムですが、なぜかエラーになってしまいます。
--- ABC.java ---
class ABC{
public void test(){
System.out.println(test);
}
}
--- DEF.java ---
public class DEF{
public static void main(String args[]){
ABC dt = new ABC();
dt.test();
}
}
エラー内容
シンボルを解釈処理できません。
ABC dt = new ABC();
^
となってしまいます。
なにか勘違いしていることがあるような気がします。
どなたから教えてください。
Sourceは特に問題ないとと思います。
考えられる事はABC.javaとDEF.javaを別々のフォルダにいれてコンパイルしてるぐらいです。
packageを記述してらっしゃいますか?
複数ファイルを扱うときは、それぞれのファイル、
この場合、ABC.javaとDEF.javaの一番上に、
package DirName;
を入れる必要があります。DirNameは、二つのファイルが入っているディレクトリの名前
です。
コンパイルは、
>javac DirName/*.java
実行は、
>java DirName.package DEF
おっと間違い。
実行は、
>java DirName.DEF
ありがとうございます。できました!
package指定が関係あるとは。勝手に関係ないと思っていました。
上記2つのソースに↓を加えて
package test;
その2つのソースをtestフォルダにコピーしました。
そして、testフォルダの1つ上のフォルダから
javac test/*.java
java test.DEF
で見事実行できました。
ところで、このtestフォルダをカレントにして
java DEF
や
java test.DEF
とやると
やっぱり、NoClassDefFoundErrorになってしまいます。
こちらについてはしょうがないのでしょうか。
Javaコンパイラ、インタプリタは.classファイルを探す際に、以下の順番で検索
を行ないます。
1.カレントフォルダからの相対パス
2.CLASSPATH環境変数で指定されたフォルダ
3.Javaクラスライブラリ
またJavaではpackage指定がないファイルは無名パッケージに自動的に割り当て
られます。従って、カレントフォルダにあるソースのみを使ってコンパイルを
行なう場合にはpackage指定はいらないはずです。
ひょっとしてCLASSPATHを設定しておらず、コンパイル時もソースのあるフォルダを
カレントフォルダにせずにコンパイルを実行していないでしょうか?
少なくとも最後の質問は
set CLASSPATH=.;%CLASSPATH%
としてから実行すればうまくいくと思います。うまくいったら最初からCLASSPATH
環境変数に「.;」を付け加えておきましょう。
> 1.カレントフォルダからの相対パス
> 2.CLASSPATH環境変数で指定されたフォルダ
JavaVM(インタプリタ)の場合はちょっと違います。
CLASSPATHが定義されている場合はカレントフォルダは見ません。
CLASSPATHが未定義の場合カレントフォルダをクラスパスとします。