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

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

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

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

Q&A

解決済

2回答

3176閲覧

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

yassan19

総合スコア19

Java

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

1グッド

0クリップ

投稿2018/12/26 18:19

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ゲームの敵役クラス

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

kinkin334👍を押しています

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

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

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

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

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

m.ts10806

2018/12/26 21:31

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

回答2

0

ベストアンサー

ヒーローを 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/26 19:00

set0gut1

総合スコア2413

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

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

LouiS0616

2018/12/27 03:57

憎しみの連鎖 +1
A-pZ

2018/12/30 01:40

同じく+1
退会済みユーザー

退会済みユーザー

2018/12/30 02:49

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

0

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

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

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

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

投稿2018/12/26 23:35

kinkin334

総合スコア62

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問