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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

1439閲覧

packageがメインクラスにあるとはどういうことなんでしょう?

chimo

総合スコア55

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/04/29 04:49

編集2020/04/29 08:53

packageって通常メインクラスにインポートされるものだと思っていたのですが、メインメソッドにpackageがある場合はどのように解釈すればよいのでしょう。

起動させるクラスは5つありまして
①SimulateMonsterBattle…メインメソッド。BattleWildを起動してるだけ
②BattleWildクラス…モンスター同士を戦わせるような実装をしてます
③Monster3クラス…モンスターのhpや攻撃力などを管理しています
④Hitokakeクラス…Monster3を継承しています。キャラクター独自の攻撃力などを保持してます。
⑤Fushigiyadeクラス…Monster3を継承しています。キャラクター独自の攻撃力などを保持してます。

このうちわたしが作成したのは③④⑤で、①②はすでに作成されているものなのですが、①②にpackage pokemnとありました。package pokemnがよくわからなかったので消してコンパイルすると、コンパイルは通ったのですが、以下のようなエラーが出てきました

java

1C:\WorkSpace\Java.Ob\Practice\Test>java SimulateMonsterBattle 2Exception in thread "main" java.lang.NoClassDefFoundError: Fushigiyade 3 at BattleWild.mainBattle(BattleWild.java:16) 4 at SimulateMonsterBattle.main(SimulateMonsterBattle.java:8) 5Caused by: java.lang.ClassNotFoundException: Fushigiyade 6 at java.net.URLClassLoader.findClass(Unknown Source) 7 at java.lang.ClassLoader.loadClass(Unknown Source) 8 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 9 at java.lang.ClassLoader.loadClass(Unknown Source) 10 ... 2 more

調べてみるとクラスパスがどうのこうのと書いてたので多分packageを消したのが駄目だったんだなと思ったのですが、さらに調べるとpackageがメインメソッドにかかれてるものがなかったです。普通packageってメインメソッドにインポートされるものなのになぜpackageがメインメソッドにあるのでしょう?ちなみに作成者に連絡取れないので直接聞けません。解決してほしいというよりは、ヒントをもらえたら…と思います。

どなたか解決への糸口を一緒に見つけてもらいたいです。
おねがいします。

5つクラスがあるのでソースコードが字数制限の関係で全てのせられません。
もし原因と思われるソースコードあれば指定してもらえれば載せます。

②のコード

package pokemon; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; class BattleWild { //フィールド(定数) final int ESCAPE_SUCCESS_ST_RATE = 50 ; //「にげる」成功率の基準値(50%) //やせいのモンスターとのバトル public void mainBattle () { //バトル相手をインスタンス化 Fushigiyade enemy = new Fushigiyade("やせい","フシギヤデ",20); prinTextAsGame("あっ! やせいの " + enemy.getCharacter() + " が とびだしてきた!"); //何か入力されるまで待機 System.out.println("▼"); pushBtn(); //自分のモンスターをインスタンス化 System.out.println(""); Hitokake myMonster = new Hitokake("ぼく","カケ郎",21); prinTextAsGame("ゆけ! " + myMonster.getName() + "!"); //何か入力されるまで待機 System.out.println("▼"); pushBtn(); //バトルで使用するローカル変数の定義 boolean winFlg = true; //勝利フラグ(初期値true) boolean escapeFlg = false; //逃走フラグ(初期値false) int turn = 0; //ターン数(初期値0) int dmg; //与えるダメージ String cmd; //プレイヤーからの入力コマンド boolean firstAtkFlg; //先攻フラグ //どちらかのHPゼロになるか「にげる」が成功するまでバトルを繰り返す while(myMonster.getHp() > 0 && enemy.getHp() > 0){ //ターン開始時にローカル変数を初期化 turn = turn + 1; //繰り返しのたびにターン数を+1する dmg = 0; cmd = null; firstAtkFlg = true; //先攻フラグ(初期値true) //ターン数の表示 System.out.println(""); System.out.println("~~~ ターン" + turn + " ~~~"); //互いのステータスを表示 System.out.println(""); System.out.println("あいて:" + enemy.getStatus() ); System.out.println("こちら:" + myMonster.getStatus() ); //getCmdメソッドからコマンドを受け取る System.out.println(""); cmd = getCmd(myMonster.getName()); //先攻・後攻を決定する if(myMonster.getSpd() < enemy.getSpd()){ //相手のモンスターとスピードを比較し、相手が速ければ先攻フラグをfalseに変える firstAtkFlg = false; }else if (myMonster.getSpd() == enemy.getSpd()){ //スピードが全く同じであれば50%の確率で先攻フラグをfalseに変える firstAtkFlg = judgeFiftyFifty(); } if(firstAtkFlg){ //自分のモンスターが先攻の場合 //自分のモンスターの行動 System.out.println(""); if(cmd.equals("1")){ //「たたかう」コマンドの場合 //相手のモンスターにダメージを与える dmg = enemy.damaged(myMonster.useWaza()); prinTextAsGame(myMonster.getName() + "の " + myMonster.getWaza_nm() + " !"); prinTextAsGame(" → " + enemy.getName() + " は " + dmg + " のダメージ を うけた!"); }else if(cmd.equals("2")){ //「にげる」コマンドの場合 //「にげる」が成功した場合は繰り返しを抜け、失敗した場合は「にげられない!」と表示する escapeFlg = challengeEscape(myMonster.getSpd() , enemy.getSpd()); if(escapeFlg){ break; }else{ System.out.println(""); prinTextAsGame("にげられない!"); } } //何か入力されるまで待機 System.out.println("▼"); pushBtn(); //相手のモンスターの行動(HPがゼロの際は何もしない) System.out.println(""); if(enemy.getHp() > 0){ //相手のモンスターからダメージを受ける dmg = myMonster.damaged(enemy.useWaza()); prinTextAsGame(enemy.getName() + "の " + enemy.getWaza_nm() + " !"); prinTextAsGame(" → " + myMonster.getName() + " は " + dmg + " のダメージ を うけた!"); //自分のモンスターのHPが0の場合は勝利フラグをfalseに変える if(myMonster.getHp()==0){ winFlg = false; } } //何か入力されるまで待機 System.out.println("▼"); pushBtn(); }else{ //自分のモンスターが後攻の場合 //相手のモンスターの行動 System.out.println(""); //相手のモンスターからダメージを受ける dmg = myMonster.damaged(enemy.useWaza()); prinTextAsGame(enemy.getName() + "の " + enemy.getWaza_nm() + " !"); prinTextAsGame(" → " + myMonster.getName() + " は " + dmg + " のダメージ を うけた!"); //自分のモンスターのHPが0の場合は勝利フラグをfalseに変える if(myMonster.getHp()==0){ winFlg = false; } //何か入力されるまで待機 System.out.println("▼"); pushBtn(); //自分のモンスターの行動(HPがゼロの際は何もしない) System.out.println(""); if(myMonster.getHp() > 0){ if(cmd.equals("1")){ //「たたかう」コマンドの場合 //相手のモンスターにダメージを与える dmg = enemy.damaged(myMonster.useWaza()); prinTextAsGame(myMonster.getName() + "の " + myMonster.getWaza_nm() + " !"); prinTextAsGame(" → " + enemy.getName() + " は " + dmg + " のダメージ を うけた!"); }else if(cmd.equals("2")){ //「にげる」コマンドの場合 //「にげる」が成功した場合は繰り返しを抜け、失敗した場合は「にげられない!」と表示する escapeFlg = challengeEscape(myMonster.getSpd() , enemy.getSpd()); if(escapeFlg){ break; }else{ System.out.println(""); prinTextAsGame("にげられない!"); } } } //何か入力されるまで待機 System.out.println("▼"); pushBtn(); } } //バトル結果 if(escapeFlg){ System.out.println(""); prinTextAsGame("うまく にげきれた!"); }else{ if(winFlg){ System.out.println(""); prinTextAsGame(enemy.getTrainer() + "の " + enemy.getCharacter() + " は たおれた!"); }else{ System.out.println(""); prinTextAsGame(myMonster.getTrainer() + "は めのまえが まっくらに なった!"); } } System.out.println("(バトル終了)"); } //戦闘コマンドを受け付ける //※内部的に使うメソッドなのでprivate設定にする private String getCmd(String monsterName) { BufferedReader br = null; String cmdin = null; try { br = new BufferedReader(new InputStreamReader(System.in)); do { // prinTextAsGame(monsterName + "は どうする?"); System.out.println("1:たたかう 2:にげる"); System.out.println("▼"); cmdin = br.readLine(); if(!(cmdin.equals("1") || cmdin.equals("2"))){ System.out.println("[INFO]コマンドが不正です。再入力してください。"); } } while(!(cmdin.equals("1") || cmdin.equals("2"))); } catch(IOException e) { e.printStackTrace(); } return cmdin; } //何かしらの入力があるまで待機する //※内部的に使うメソッドなのでprivate設定にする private String pushBtn() { BufferedReader br = null; String cmdin = null; try { br = new BufferedReader(new InputStreamReader(System.in)); cmdin = br.readLine(); System.out.println(""); } catch(IOException e) { e.printStackTrace(); } return cmdin; } //コマンド「にげる」選択時の処理 //※内部的に使うメソッドなのでprivate設定にする private boolean challengeEscape(int spMy, int spEn) { boolean escapeFlag; //成功率(100を越えることを許す) int success_rate = (int) ESCAPE_SUCCESS_ST_RATE * spMy / spEn ; //1~100のランダムな数字を取得 int rndmNum = 1 + (int)(Math.random() * 100.0); //1~100のランダムな数字より成功率の方が高ければ「逃げる」成功 if(rndmNum < success_rate){ escapeFlag = true; }else{ escapeFlag = false; } return escapeFlag; } //50%の確率でtrueを返す(すばやさが同じだった場合にどちらを先攻とするか決める際に使用) //※内部的に使うメソッドなのでprivate設定にする private boolean judgeFiftyFifty() { boolean judge = true ; //0か1をランダムで取得 int rndmNum = (int)(Math.random() * 2.0); if(rndmNum == 0){ judge = false ; } return judge; } //文字をゲームのように表示(50ミリ秒に1文字) //※内部的に使うメソッドなのでprivate設定にする private void prinTextAsGame(String txt){ //文字列を配列に1文字ずつセット char data[] = txt.toCharArray(); //配列数を取得 int arr_num = data.length; for (int i = 0; i < arr_num; i++) { try{ //指定ミリ秒の間眠る Thread.sleep(50); }catch(InterruptedException e){ e.printStackTrace(); } System.out.print(data[i]); } System.out.print("\n"); } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/04/29 09:00

https://teratail.com/questions/254913#reply-367439 聞いている内容はともかく、解決方法は同じじゃないでしょうか。 質問履歴を見ると、昨日今日始めたわけでもなさそうなのに、なぜ今という気がしますが。
chimo

2020/04/29 14:45

本当ですよね^-^; 学習し始めて三か月というのに、きっと馬鹿みたいな質問をしているのだと思います。情けないです。 URL拝見させていただきました! 「これを解消する方法は、既に書いたように、パッケージ宣言を書いてそのディレクトリに置けるようにする」 と書かれてありましたが、つまり、パッケージ宣言を「package pokemn」という風に各クラスに書き、pokemnというフォルダ内にそれらを保存すれば良いということなのでしょうか...?
guest

回答1

0

packageって通常メインクラスにインポートされるものだと思っていたのですが

この考えが誤りです。別にmainメソッドを含むクラスがpackageに属していても構いません。

そして、package privateなど、「同一パッケージになければ呼べない」ものも存在しますので、そのようなクラスを呼ぶにはmain側も同じパッケージに入れる必要があります。

投稿2020/04/29 05:03

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chimo

2020/04/29 08:20

なるほど...。でもpackageがあるということはimportもあるということですよね?メインメソッドにpackageがある場合どこにインポートすれば良いのでしょうか。それともpackageがあるからといって必ずしもインポートを行う必要はないのでしょうか?
maisumakun

2020/04/29 08:21

> でもpackageがあるということはimportもあるということですよね? いえ、そのパッケージを外部から参照しない限りは不要です。
chimo

2020/04/29 08:28

私の場合だとpackage pokemnに入っている①②は③④⑤で使いたいのですが、この場合は①と②を③にも④にも⑤にもインポートしなければいけないということでしょうか
maisumakun

2020/04/29 08:33

> 私の場合だとpackage pokemnに入っている①②は③④⑤で使いたいのですが 実際のコードがないとなんとも言えません。package privateやprotectedの場合、同じパッケージに入れなければ使えません。 あと、ここまで書くのを忘れていましたが、importは表記上の便法に過ぎません。importしなくても、たとえば「java.util.Arrays」のように完全修飾名で参照すれば(見えるものは)呼び出し可能です。
chimo

2020/04/29 08:45

実際のコードをのせたいのですがおそらく字数的にきびしそうです。 ただ、フィールドの定義にprivateはつけていますがpackage privateではないと思います。 エラーの内容がわからないです…
chimo

2020/04/29 08:53

②のコードだけのせれましたので、のせておきました。
maisumakun

2020/04/29 08:56

> package privateではないと思います。 いえ、このクラスはpackage privateです。publicやprivateなどを何も付けなければpackage privateになります。
chimo

2020/04/29 13:35

何もわかってませんでした。申し訳ないです...。ということは全てのクラスを同じパッケージ(package pokemn)に入れなければならないということでしょうか?
maisumakun

2020/04/29 13:38

そうするか、publicにして外部参照できるようにするかどちらかです。
chimo

2020/04/29 13:41

全部をpackage pokemnに入れて、全てのクラスのソースコードに「package pokemn」と書くのですか?別にインポートもしないのであれば、わざわざ全てのクラスにpackage pokemnと書かなくてもいいような気がしてしまいます...。
maisumakun

2020/04/29 13:44

> 全部をpackage pokemnに入れて、全てのクラスのソースコードに「package pokemn」と書くのですか? 逆に気になっているのですが、もともとそうなっていたのを変える必要があるのですか?
chimo

2020/04/29 14:18

そうですね...。 現時点で①~⑤のすべてにpackage pokemnと書いて、 C:\WorkSpace\Java.Ob\Practice\Test\pokemn←このpokemnに全てのクラスを入れています。 メインクラスをコンパイルしようとすると、 SimulateMonsterBattle.java:7: error: cannot find symbol BattleWild battleAtWild = new BattleWild(); ^ symbol: class BattleWild location: class SimulateMonsterBattle SimulateMonsterBattle.java:7: error: cannot find symbol BattleWild battleAtWild = new BattleWild(); ^ symbol: class BattleWild location: class SimulateMonsterBattle 2 errors このエラーが出ます。調べると必要なパッケージがインポートされていないことが 原因というふうに出てきたのですが、mainメソッドにはすでに「package pokemn」があるので どこになにをインポートすればいいのか分からないです...。
chimo

2020/04/30 07:32

>逆に気になっていたのですが、もともとそうなっていたのを変える必要があるのですか? もともとpackage pokemnが書かれてあったのは①と②だけで、③④⑤は自分で書いたコードなのでもともとpackage pokemnと書かれていたわけではないんです。別にパッケージ分けしてインポート宣言しろという指示もなかったので、今まで通り同じファイルに①~⑤の全てを入れてメインクラスをコンパイルすれば上手く実行できるのではないかと思いました。そして、別にインポートもしないし全部同じファイルにいれるなら①と②だけpackage pokemnと書いて区別しても意味ないのでは?と思い、もともとかかれてあったpackage宣言を消すに至りました。
dodox86

2020/05/12 01:35

横からすみません。2020/05/12 10:30時点で「まだ回答を求めています」状態になっているのが目についたので。 既にmaisumakunさんにご回答いただいたように > 別にmainメソッドを含むクラスがpackageに属していても構いません。 とあり、更に、質問者chimoさんの[2020/04/29 22:41]のコメント > 全部をpackage pokemnに入れて、全てのクラスのソースコードに「package pokemn」と書くのですか?別にインポートもしないのであれば、わざわざ全てのクラスにpackage pokemnと書かなくてもいいような気がしてしまいます...。 ですが、「わざわざ全てのクラスにpackage pokemnと書かなくてもいいような気がしてしまいます」とは、逆に、「書いても良い」と言うことでもあります。オリジナルの作者様に、pokemnパッケージ内に押し込めたかったという意図がある気がしますが、作者様に連絡が取れない以上はその意図を確かめることはできないでしょう。コンパイルエラーは質問者さん自身がそのパッケージ構造を変えてしまったことに起因しています。これ以上、本質問は何をもって解決となり得るのでしょうか。
chimo

2020/05/13 02:53

>dodoxさん コメントありがとうございます。わたしもあえてオリジナルのソースコードにpackage pokemnと書かれてあったのに消す必要は無かったと思い直し、5つの全てのコード(先生(?)が書いたコード二つ+私が書いたコード3つ)に関しまして一度全てのクラスにpackage pokemnと書きましたが、エラーが出てしまいました。エラー内容は「2020/04/29 23:18 」にここに私がコメントした内容です。私の見立てとしてはコードにエラーがあるというよりかは、インポートができてないことによって起こるエラーなのかなと感じてます。ということは、5つ全てのクラスにpackage pokemnと書くことは解決策ではないのでは...というのが私の意見です。少なくともこのエラーが解決したときに、この質問も解決にしたいと思います。
maisumakun

2020/05/13 03:03

BattleWildクラスは定義されていますか?
chimo

2020/05/13 03:12

【BattleWildクラスの一部】 package pokemon; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; class BattleWild { //フィールド(定数) final int ESCAPE_SUCCESS_ST_RATE = 50 ; //「にげる」成功率の基準値(50%) //やせいのモンスターとのバトル public void mainBattle () { //バトル相手をインスタンス化 Fushigiyade enemy = new Fushigiyade("やせい","フシギヤデ",20);......... 【メインクラスの全て】 package pokemon; class SimulateMonsterBattle { public static void main (String[] args) { //やせいバトル(BattleWildクラス - mainBattleメソッド)を実行 BattleWild battleAtWild = new BattleWild(); battleAtWild.mainBattle(); } } という感じです。BattleWildクラスは定義できていると思うのですが...
maisumakun

2020/05/13 03:13

> BattleWildクラスは定義できていると思うのですが... パッケージ名の違い(pokemnとpokemon)は意図したものですか?
chimo

2020/05/14 13:39

>パッケージ名の違い(pokemnとpokemon)は意図したものですか? はい。すみません。載せたコードの方にもpokemnと書きなおしておくべきでした。書いたコードの方は公開するわけでもないので「pokemon」と書いても問題ないと思って書いたのですが、teratailで質問する時にまずいと思ったので「pokemn」に変えた、という経緯でした。誤解をまねくような書き方をして申し訳ございませんでした。
maisumakun

2020/05/15 04:29

> 誤解をまねくような書き方をして申し訳ございませんでした。 えっと、実際のコードでは全部同じパッケージに属している、ということは間違いないですか?
chimo

2020/05/15 08:05

>えっと、実際のコードでは全部同じパッケージに属している、ということは間違いないですか? はい。実際のコードでは先生が書いたコード2つと私が書いたコード3つの計5つ全てに「package pokemn」と書いて、「pokemn」という名前のフォルダに入れております。先生が書いたコード2つと一緒に私が書いたコード3つを組み合わせて実行すると、某モンスターゲームのような動きをしてくれるそうなのですが...
maisumakun

2020/05/15 08:11

「class BattleWild」のコードがあるファイルの名前は何でしょうか?
chimo

2020/05/16 05:22

「C:\WorkSpace\java\ob\Practice\Test\pokemn」 これは5つ全てのコードのパスです。なのでBattleWildもpokemnという名前のファイルに入れております。全てのコードに「package pokemn」と書き、BattleWild.javaを含めて5つ全てのファイルをpokemnというファイルに入れております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問