こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Java:packageについて

いつもお世話になっております。

Javaのpackage機能について教えていただけますでしょうか。

ただいまJavaの勉強中で、本を購入し、それを基にソースを書いたり動かしております。

その中にpackage機能について説明とサンプルソースがあるのですが、
本のまま書いてもエラーで動きません。本とソースを見比べても相違が見られないため
何が原因かも分からず、困っております。

内容

・Cドライブ直下にwork3というフォルダを作成
・work3直下にMain.javaを作成する。
・work3の中にconverterというフォルダを作成する。
・converterフォルダ内にDollar.javaとEuro.javaを作成する。
・コマンドプロンプトにてc:\work3に移動し、Javac **.javaを実行後、java Mainを実行する。

コンパイルは成功し、それぞれのclassファイルは作成されております。
実行すると
C:\work3>java Main
Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: con
verter/Main)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: Main. Program will exit.

とエラーが出て実行されません。

実際のソースです。


******************
package converter;
public class Dollar {
 public static int toYen(int dollar){
 return dollar * 90;
 }
}
******************
package converter;
public class Euro {
 public static int toYen(int euro){
  return euro * 120;
 }
}
******************
package converter;
class Main {
 public static void main(String[] args){
  System.out.println("1ドルは" + Dollar.toYen(1) + "円です。");
  System.out.println("1ユーロは" + Euro.toYen(1) + "円です。");
 }
}
******************

ちなみにですが、3つのソースはjarファイルの実習で使用し、うまく動いてくれました。
packageの実習でpackage ***を一行追加しただけです。

よろしくお願いいたします。

投稿日時 - 2010-11-22 23:22:43

QNo.6337516

困ってます

質問者が選んだベストアンサー

何の本で勉強してるのか、分かりませんが…
(おそらくOSは関係ないとも思います。)

試しに私のPCで

work3---Main.java
..|
..|-----converter-------Dollar.java
........................................|
........................................|----Euro.java

このような配置で
C:\work3>javac **.java (なんとかコンパイルはできたようですが…) 

C:\work3>java Main
質問文と同様なエラーで実行できませんでした。

どうしてもそのような配置にして
(つまり converterフォルダ内には、Dollar.java Euro.java の2つだけ
  Main.java はconverterフォルダの外に配置)
また、どうしても その本のような動作にしたいのなら
Main.java の package converter; は消して、その代わり import を記述します。

******************

import converter.Dollar;
import converter.Euro;

public class Main
{
public static void main(String[] args){
System.out.println("1ドルは" + Dollar.toYen(1) + "円です。");
System.out.println("1ユーロは" + Euro.toYen(1) + "円です。");
}
}

******************

import で最初に パス(階層)を記述していますから、javac **.java でコンパイルで通るはずです。
これでとりあえずは その本のような

C:\work3>javac **.java

C:\work3>java Main
1ドルは90円です。
1ユーロは120円です。

C:\work3>

(私のPCでも)このような(同じ)動作になりました。

投稿日時 - 2010-11-23 11:33:46

お礼

私のためにお手数おかけいたしまして申し訳ございませんでした。

import文は次の実習でありまして、そちらではちゃんと動いてくれました。

本は日○ソ○ト○ェアの最新Javaプログラミングという本です。

packageは一旦飛ばします。monoerezsh様に教えていただいたように

packageは同階層に置いて使う
importは別階層で使う

という感じで次に進みたいと思います。


本当にありがとうございました。

投稿日時 - 2010-11-23 12:00:39

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

******************
package converter;
class Main {
 public static void main(String[] args){
  System.out.println("1ドルは" + Dollar.toYen(1) + "円です。");
  System.out.println("1ユーロは" + Euro.toYen(1) + "円です。");
 }
}
******************

このソースに従うと Main.java Dollar.java Euro.java
この3つを converterフォルダの中に入れて下さい。
つまり >>・work3直下にMain.javaを作成する。(←この配置が間違っています。)

次に
Javac **.java で確かに(無理矢理)コンパイルは出来て
classファイルは作成されますが、実際動かないでしょう。
(同じようなエラーメッセージが出ました)


コマンドプロンプトにてc:\work3に移動し、javac converter/Main.java でコンパイル
(これで自動的に残りのDollar.java Euro.javaがコンパイルされ、パス(階層)が通ります)
java converter/Main で実行です。

投稿日時 - 2010-11-23 02:20:16

お礼

monoerezsh様の仰るやり方で動きました。ありがとうございました。

ただ、本の通りに書いても動かないのがわかりません。

今更で申し訳ございませんが、2点について本の通りってわけでは無い箇所があります。

work3---Main.java
..|
..|-----converter-------Dollar.java
........................................|
........................................|----Euro.java

ディレクトリ構造は上記のように本に書いてあります(こちらは質問文と同じです)

1点目はMain.javaは実際のソースは記載されておりません。
*Dolla.javaとEuro.javaは本に書いてある通りです。

違う部分はMain.javaです。実際に書いてあるのは

c:\work2\Main.javaをc:\work3フォルダにコピーし、リスト5の(1)のようにpackage文を追加する

と書いてあります。

c:\work2\Main.javaとはjarファイルの実習で使用したもので、package実習にて流用するという
意味と思われます。質問に書きましたがjarファイルでは問題なく動きました。

「リスト5の(1)のように」ですが、リスト5がEuro.javaで、最初にpackage converterの一文の後に
(1)が書いてあります。つまり

リスト5
******************
package converter; ・・・・・・・・・・・・(1)
public class Euro {
public static int toYen(int euro){
return euro * 120;
}
}
******************

となっております。ですので、質問文のMain.javaを書きました。

ここの部分で私が間違った解釈をしたのでしょうか。

2点目ですが、私の環境はWinXP SP3ですが、本の環境はVista SP1です。

JVMなどの実際にJavaを動かす環境は付録のCDからインストールしました。
*もちろん本に書いてある通りに行ったと思いますが・・・


また、本にコマンドプロンプト画像キャプチャがありますが、そちらは

C:\work3>javac **.java

C:\work3>java Main
1ドルは90円です。
1ユーロは120円です。

C:\work3>

とちゃんと動いているようです。

投稿日時 - 2010-11-23 09:51:13

ANo.1

java -classpath .:converter Main
ではいかがでしょうか

投稿日時 - 2010-11-22 23:43:54

お礼

早速のご回答、ありがとうございます。

しかし、質問内容と同じエラーでした。

投稿日時 - 2010-11-23 00:20:34

あなたにオススメの質問