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

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

ただいまの
回答率

89.70%

java エクリプスでのソースコードの実行をした際にエラーが出てきてしまいます。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 471

yassan19

score 13

javanの勉強中にエクリプスでソースコードを実行していた際にこのようなエラーメッセージが出てきてしまい困っています。
イメージ説明
Exception in thread "main" java.lang.StackOverflowError
at auderworld.Enemy1k.<init>(Enemy1k.java:12) //1
at auderworld.Hero.<init>(Hero.java:14) //2
//1と//2に関しては何行も連なって出てきていますのでここでは割愛させていただきます。

ソースコードが問題なのかとも思いましたが、私が見る限りソースコードに不備は見当たりません。しかしソースコードも一応載せておきます。

package名は underworld
でクラスは3つです。

1 Main.javaクラス

package auderworld;

public class Main {
public static void main(String[] args) {
Hero h1 = new Hero();
Enemy1k e1 = new Enemy1k();
h1.appaer();
e1.appaer();
}
} //他のクラスを呼び出すクラス

2 Hero.javaクラス

package auderworld;

public class Hero {
String name ;
int hp;
int level;

Hero(){
this.name = "ヤス";
this.hp =100;
this.level =1;
}
Enemy1k e = new Enemy1k();
void status() {
System.out.println("勇者"+this.name+"\nlevel"+this.level+"\nhp"+this.hp);
}
void appaer() {
System.out.println(this.name+"が現れた!");
}
void sleep() {
this.hp +=100;
System.out.println(this.name+"は眠った");
System.out.println("hpは100回復した");
}
void slip() {
this.hp -=5;
System.out.println(this.name+"は、転んだ");
System.out.println("5ダメージを受けた");
}
void sit(int sec) {
this.hp += sec;
System.out.println(this.name+"は座った");
System.out.println("hpは、"+sec+"回復した");
}
void atack() {
e.hp1 -=40;
System.out.println(e.name1+"は、"+e.name1+"から攻撃を受けた");
System.out.println(e.name1+"に40のダメージ!");
}

}
// RPGゲームの主人公クラス

3 Enemy1k.java クラス

package auderworld;

public class Enemy1k {
String name1;
int hp1;
final int level1 =5;

Enemy1k(){
this.name1 = "毒キノコ";
this.hp1 = 60;
}
Hero h1 =new Hero();
void status() {
System.out.println("敵"+this.name1+"\nHP"+this.hp1+"\nlevel"+this.level1);
}
void appaer() {
System.out.println(this.name1+"レベル"+this.level1+"現れた!");
}
void atack() {
h1.hp=40;
System.out.println(this.name1+"の攻撃");
System.out.println("毒ガス攻撃により"+h1.name+"のhpは40減少した!");
}
void escape() {
System.out.println(this.name1+"逃げて行った");
}
}

//RPGゲームの敵役クラス

といったソースコードになります。ネットで検索してみましたがメモリーの使用上限を超えた際に出るエラーとの情報は得られましたがはっきりとした解決策が出てこずこの場を借りてご質問させていただきます。お忙しい中とは思いますが、どなたかアドバイスをよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2018/12/27 06:31

    コードはマークダウンのcode機能を利用してください

    キャンセル

回答 2

checkベストアンサー

+10

ヒーローを new すると、インスタンス変数として敵が new され、
敵を new すると、インスタンス変数としてヒーローが new され、
これが無限に繰り返されますね。
まさに憎しみの連鎖ですね。

Enemy1k のインスタンス変数 Hero h1 は外部から与える、とかすると、とりあえず動くと思います。

public class Enemy1k {
  String name1;
  int hp1;
  final int level1 =5;
  Hero h1;

  Enemy1k(Hero hero){
    this.name1 = "毒キノコ";
    this.hp1 = 60;
    this.h1 = hero;
  }
Hero h1 = new Hero();
Enemy1k e1 = new Enemy1k(h1);

本当は attack メソッドの引数に攻撃対象として Hero とか Enemy1k のインスタンスを渡すのが良いと思いますが、そのへんは頑張ってください。
(atack はスペルミスです。)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/27 12:57

    憎しみの連鎖 +1

    キャンセル

  • 2018/12/30 10:40

    同じく+1

    キャンセル

  • 2018/12/30 11:49

    英雄と魔物が循環することがおかしいけどね(どこの、まおゆう状態)

    キャンセル

0

実行クラス、HeroクラスとEnemy1kクラスの循環参照が原因です。

クラス図を出力するプラグイン「AmaterasUML」をインストールしてみてはいかがでしょうか?
ソースコードからクラス図を作成してくれます。
クラス図を見れば循環参照がビジュアル的に分かると思います。

https://qiita.com/meio/items/e71dbcf32dbfce59a987

PS.
ソースを投稿する場合はコードタグを付けるようにしましょう。
イメージ説明
コードのネストがなくなると非常に見づらいです。
特に長いコードだと読み間違いが発生しやすいです。
当然、回答の頻度がへる事になります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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