質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

javaのパッケージのコンパイルについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,450

coreysnop

score 7

初めての利用です。
javaについてなんですが、パッケージがコンパイルできなくて困っているんですが、解決法を教えて下さい。

⇩これはコンパイルできたんですけど、
package Calcapp.logics;

public class CalcLogic{

public static int tasu(int a, int b){
return (a + b);
}

public static int hiku(int a, int b){

return (a - b);
}}

⇩こっちのほうがコンパイルできなくて、
Calc.java:11: エラー: パッケージCalcapp.logicsは存在しません
int total = Calcapp.logics.CalcLogic.tasu(a, b);
^
Calc.java:13: エラー: パッケージCalcapp.logicsは存在しません
int delta = Calcapp.logics.CalcLogic.hiku(a, b);
^
エラー2個
こういう表示がされたんですけどどうすればコンパイルできますか?

package Calcapp.main;

public class Calc{

public static void main(String[] args){

int a = 10;
int b = 2;

int total = Calcapp.logics.CalcLogic.tasu(a, b);

int delta = Calcapp.logics.CalcLogic.hiku(a, b);

System.out.println("足すと" + total + " 、引くと" + delta);
}}

補足
何度もメッセージありがとうございます,これでも正確に説明できてなかったらすいません。

ディレクトリー構成はjava/calcapp/main,logics

コンパイルは1回目は 
javac java/calcapp/logics/CalcLogic.javaと指定してコンパイル
2回目は
javac java/calcapp/main/Calc.javaでコンパイルしたらエラーが出たんで、
javac java/Calc.java
でコンパイル成功してできたCalc.classをmainディレクトリにコピーして、
java calcapp.main.Calcで実行したらエラーが表示されて実行できません。

osはmacです。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • keicha_hrs

    2017/10/18 06:08

    Yahoo知恵袋にもほぼ同時刻に全く同じ内容の質問を投稿されていますね。これは「マルチポスト」と呼ばれ、推奨されない行為です(https://teratail.com/help#posted-otherservice)。今回は初めてということなので知らなかったとしても、今後は控えるべきでしょう。

    キャンセル

  • coreysnop

    2017/10/18 12:43

    すいません、マルチポスト知りませんでした。指摘ありがとうございます、今後気をつけます

    キャンセル

回答 2

checkベストアンサー

+1

提示しておられるソース自体はやりかたさえ正しければコンパイルエラーは出ないはずですが、逆に「どうやったらこういうエラーが出るのか」についてはいくつか可能性が考えられます。多分「ディレクトリー構成/プロジェクト構成が不適切」あたりと思いますが、あなたがどうやったのかもう少し詳細な情報が必要です。

  • どのようなディレクトリー構成・プロジェクト構成か
  • コンパイルは何を使ってどういう操作手順でやったか
    javacならどのディレクトリーで、どんなパラメーターを指定したかといったことです
  • 一応OSも書いておいた方がよいでしょう(Mac/Linux/Windowsのどれか程度)

こうしたことを明確にしてみてください。そうすれば原因と対処もはっきりすると思います。


追記:

keicha_hrsさん回答のようにすればコンパイルと実行ができると思いますので問題は解決できると思います。若干蛇足的な補足をしてみます。

(1) ソースファイルはパッケージ名と正確に一致したディレクトリーに配置する

大文字小文字を一致させなければならないのはkeicha_hrsさんコメントの通りです。ただ、2回目のコンパイルのときに「javac java/Calc.javaでコンパイルが成功した」と書かれているのですが、もしそのとおりならCalc.javaはjavaディレクトリーの直下に置いてあったはずです。しかしそういう場所に置くのはお勧めできません。Calc.javaが他のパッケージのクラスを全く参照していなければコンパイル自体はできますが、その代わり今回の問題のようにCalcクラスを別のソースファイルから参照するようなことができなくなってしまいます。コンパイルした結果できたclassファイルを別の場所へ無理やり移動するという手順も通常はやるべきではないです。最初から

java/Calcapp/main/Calc.java
java/Calcapp/logics/CalcLogic.java

のように置いておき、javaディレクトリーで

javac Calcapp/main/Calc.java (コンパイル)
java Calcapp.main.Calc (実行)

とするのが一番単純な方法です。(keicha_hrsさんのコメントにあるのと同じ方法です)

(2) Javaのソースファイルとclassファイルを別々のディレクトリーへ作成する

javacではなくIDEを使ってjavaプログラミングをするとわかりますが、classファイルはソースファイルとは別のディレクトリーに作成されるのが普通です。例えば以下のように。

java/Calcapp/main/Calc.java
java/Calcapp/logics/CalcLogic.java

bin/Calcapp/main/Calc.class
bin/Calcapp/logics/CalcLogic.class

そうなっていると「ソースだけを誰かに渡したい」、「クラスファイルだけを消したい」などという場合に都合がよいのです。javacを使う場合でもこのようにできます。例えばjavaディレクトリーでコンパイル&実行をするなら

javac -d ../bin Calcapp/main/Calc.java (コンパイル)
java -cp ../bin Calcapp.main.Calc (実行) 

さらにjavaディレクトリーの一つ上のディレクトリーでコンパイル&実行するなら

javac -d bin -sourcepath java java/Calcapp/main/Calc.java (コンパイル)
java -cp bin Calcapp.main.Calc (実行) 

(3) パッケージ名は全部小文字にしましょう

本件の問題とは関係ありませんが、これは習慣です。大文字のパッケージ名も目にすることはなくはないですが、少々異質に見えます。小文字のみで統一するのがよいです。当然ながら(1)に書いたようにソースファイルを置くディレクトリー名もパッケージ名に合わせて全部小文字にします。

最後に、質問文に状況を追記されてますが、少々曖昧です。「ディレクトリー構成にはソースファイルをどこに置いたかも明記する」「javacやjavaコマンドをどのディレクトリーで実行したかを明記する」ことも忘れないでください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/17 23:12

    回答してくださりありがとうございます。
    コンパイルはなんとかできたのですが、今度は実行ができなくて困っています。
    java/calcapp/main,logicsのmainとlogicsのところにパッケージを保存していて、
    java calcapp.main.Calcで実行すると、
    エラー: メイン・クラスcalcapp.main.Calcが見つからなかったかロードできませんでした
    となリ実行できないのですが、どうすればよいのでしょうか?

    キャンセル

  • 2017/10/17 23:35

    とりあえず、自分の回答に示した3つの情報を「質問文の方を編集して」そちらへ書いてください。
    曖昧な書き方ではなく明確にかいてください。「logicsのところにパッケージを保存していて」と表現されてますが、それは残念ながら正確な表現ではないので明確とはいえません。おそらくは「java/calcapp/mainディレクトリーの下にCalc.javaとCalc.classの2つのファイルがある」ということなのでしょうから、そのような明確な書き方にしてください。実はjavacのパラーメータを書いていただいた方が正確に把握できます。
    「javaディレクトリーで、
    javac calcapp/main/Calc.java
    と指定してコンパイルした」などと書いた方が明解なのです。

    キャンセル

  • 2017/10/18 12:47 編集

    KSwordofHasteさん、何度も解答してくださりありがとうございます、無事コンパイルも実行もできました。
    今後もまたお世話になるかもしれないのでよろしくお願いします。

    キャンセル

+1

作業用のディレクトリーとして作成したjavaにいるものとして、

mkdir Calcapp
cd Calcapp
mkdir logics
mkdir main

のように、パッケージ名として計画している通りの階層のディレクトリーを作成します。大文字小文字は区別されますので、そこまでパッケージ名と完全に一致させましょう。

ディレクトリー構成はjava/calcapp/main,logics

では、calcappの頭が小文字のために、コードに記述するパッケージ名と完全一致しません。これが後のエラーの原因にもなっています。

そして、logicの下にCalcLogic.javaを、mainの下にCalc.javaを作成します。

これで

javaCalcapplogics
   │ └ CalcLogic.javamainCalc.java

というファイル配置になるはずです。ここで、javaディレクトリーで

javac Calcapp/main/Calc.java

のようにコマンドを実行すれば、Calc.javaのコンパイルのときにCalcLogic.javaも参照されますので、2つともコンパイルされるはずです。

ここから実行するには、同じ場所から

java Calcapp.main.Calc

のように、完全修飾クラス名で指定すれば実行できるでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/18 12:13

    自分の回答の中で一部「keicha_hrsさん」の敬称を付け忘れていたのに気づき訂正しました。
    こちらのコメント欄にて自分の粗忽をお詫びさせていただきます。失礼しました。

    キャンセル

  • 2017/10/18 12:46

    Keicha_hrsさんありがとうございます、おかげさまで解決しました。今後も機会があればよろしくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる