人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

お世話になっております。Javaに関する質問です。
パッケージpaを作成して、そのディレクトリに
ファイルSample.java(メインメソッドもSample
クラスが持っている)を置くとします。

このときに、コンパイル済みとして、例えば
c:\test>java pa.Sample
とすれば実行できますが、
c:\test\pa>java Sample
とすると「Exception in thread "main"
java.lang.NoClassDefFoundError:」と
怒られてしまいます。

単純な問題なのかもしれませんが、どうしてなのか
が分かりません。ご存知の方、おりましたらご教授
下さいますよう、お願いします。

●質問者: mimio17
●カテゴリ:コンピュータ 学習・教育
✍キーワード:Java PA test クラス コンパイル
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● mass3
●35ポイント

http://www.y-adagio.com/public/standards/tr_javalang2/packag...

(以下引用)

この単純なパッケージ構成において,Javaプラットフォームの処理系によっては,パッケージ名の構成要素を連結し,ファイル名の分離子(ディレクトリ表示子)を隣接する構成要素間に挟んで,パッケージ名をパス名に変換する。

例えば,この単純な構成をUNIXシステムで用いる場合,ファイル名の分離子は / なので,次のパッケージ名,

jag.scrabble.board

は,次のディレクトリ名へと変換される。

jag/scrabble/board

そして,

com.sun.sunsoft.DOE

は次のディレクトリ名へと変換される。

com/sun/sunsoft/DOE

(以上引用)

Windowsの場合はファイルの分離子は \ です。

つまり、

pa.Sampleは pa\Sample であり、

c:\test にいるときは、c:\test\pa\Sample となって正しいですが、

c:\test\pa にいるときは、c:\test\pa\pa\Sample となって存在しないものを指します。

だからNoClassDefFoundErrorです。

◎質問者からの返答

解答ありがとうございます。

>この単純なパッケージ構成において,Javaプラットフォームの処理系によっては,パッケージ名の構成要素を連結し,

>c:\test\pa にいるときは、c:\test\pa\pa\Sample となって存在しないものを指します。

もうこのような仕組み、ということでしょうか。

コンパイルは通るのに、不思議です。


2 ● b-wind
●35ポイント

Java のパッケージはディレクトリではありません。

あくまでパッケージです。

だからディレクトリを移動してもパッケージ名を省略できるわけではありません。

java コマンドで指定しているのも、

pa\Sample

ではなく、

pa.Sample

であることからも両者は似て非なるものであることがお分かりいただけるかと思います。

仮にディレクトリを解釈するとしたら

test.pa パッケージで無いとおかしくありませんか?

◎質問者からの返答

解答ありがとうございます。

>Java のパッケージはディレクトリではありません。

>あくまでパッケージです。

ということが厳密に決められているのなら、よく分かる

お話です。

でも、そうするとどうしてコンパイルはできてしまうのか。。

ここがまだ理解できていません。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ