複数ファイルのプログラム

[戻る]
ゴン 2002/06/15(土) 22:43:30
複数ファイルのプログラムですが、なぜかエラーになってしまいます。

--- 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();
^

となってしまいます。
なにか勘違いしていることがあるような気がします。
どなたから教えてください。

alVa 2002/06/16(日) 02:31:31
Sourceは特に問題ないとと思います。
考えられる事はABC.javaとDEF.javaを別々のフォルダにいれてコンパイルしてるぐらいです。

kody 2002/06/16(日) 09:32:06
packageを記述してらっしゃいますか?
複数ファイルを扱うときは、それぞれのファイル、
この場合、ABC.javaとDEF.javaの一番上に、
package DirName;
を入れる必要があります。DirNameは、二つのファイルが入っているディレクトリの名前
です。

コンパイルは、
>javac DirName/*.java
実行は、
>java DirName.package DEF

kody 2002/06/16(日) 17:03:17
おっと間違い。

実行は、
>java DirName.DEF

ゴン 2002/06/19(水) 00:46:29
ありがとうございます。できました!

package指定が関係あるとは。勝手に関係ないと思っていました。

上記2つのソースに↓を加えて
package test;
その2つのソースをtestフォルダにコピーしました。

そして、testフォルダの1つ上のフォルダから
javac test/*.java

java test.DEF

で見事実行できました。

ところで、このtestフォルダをカレントにして
java DEF
や
java test.DEF
とやると
やっぱり、NoClassDefFoundErrorになってしまいます。
こちらについてはしょうがないのでしょうか。

毘沙門天 2002/06/28(金) 14:33:08
Javaコンパイラ、インタプリタは.classファイルを探す際に、以下の順番で検索
を行ないます。
 1.カレントフォルダからの相対パス
 2.CLASSPATH環境変数で指定されたフォルダ
 3.Javaクラスライブラリ

またJavaではpackage指定がないファイルは無名パッケージに自動的に割り当て
られます。従って、カレントフォルダにあるソースのみを使ってコンパイルを
行なう場合にはpackage指定はいらないはずです。

ひょっとしてCLASSPATHを設定しておらず、コンパイル時もソースのあるフォルダを
カレントフォルダにせずにコンパイルを実行していないでしょうか?

少なくとも最後の質問は
 set CLASSPATH=.;%CLASSPATH%
としてから実行すればうまくいくと思います。うまくいったら最初からCLASSPATH
環境変数に「.;」を付け加えておきましょう。

dairygoods 2002/06/28(金) 17:19:08
> 1.カレントフォルダからの相対パス
> 2.CLASSPATH環境変数で指定されたフォルダ

JavaVM(インタプリタ)の場合はちょっと違います。
CLASSPATHが定義されている場合はカレントフォルダは見ません。
CLASSPATHが未定義の場合カレントフォルダをクラスパスとします。

古いスレッドには追加発言できません。