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

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

ただいまの
回答率

91.36%

  • Java

    10492questions

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

どう直せば良いのか分からなくなってしまいました。

解決済

回答 1

投稿 2017/11/22 23:49 ・編集 2017/11/23 01:21

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

shuuji

score 3

前提・実現したいこと

初心者なので、まだ理解していないところもあり説明が分かりづらい部分もあるかと思いますがご了承ください。
「スッキリわかるJava入門」を読み、Dokojavaを使いながら書いています。
あるクラスが書かれているページがあり、それを実現させるためにどうすればよいのかを考えて自分で他のクラスも書いて正常に動作できるように書いていましたが、どうしても
エラーの原因が分かりません。
ご指導のほうよろしくお願いします。
以下は元のコードです
(Hero.java)

public class Hero { 
  private String name = "ミナト";
  private int hp = 100;

  private void attack(Matango m){
    System.out.println(this.name + "の攻撃!");
    m.hp -= 5;
    System.out.println("5ポイントのダメージ!");
  }

  public void run(){
    System.out.println(this.name + "は逃げ出した!");
  }
}

発生している問題・エラーメッセージ

上のコードに対してメインクラスと敵クラスを付けたし、private設定されているのでゲッター、セッターを使いながら正常に動作するのをめざし書いていたのですが、以下のエラーがずっと解決できません。

互換性のない型 期待値: java.lang.String 検出値: void
Hero.java(17行目)

該当のソースコード

<Main.java>

public class Main { 
  public static void main(String[] args){
    Hero h = new Hero();
    Matango m = new Matango();
    System.out.println(m.getName() + "が現れた!");
    System.out.println("HP:" + m.getHp());
    System.out.println(h.getName() + "は戦うことにした!");
    System.out.println("HP:" + h.getHp());
    h.getAttack(m);
    h.run();
  }
}

<Hero.java>

public class Hero { 
  private String name = "ミナト";
  public String getName(){return this.name;}
  public void setName(String name){this.name = name;}

  private int hp = 100;
  public int getHp(){return this.hp;}
  public void setHp(int hp){this.hp = hp;}

  private void attack(Matango m){
    System.out.println(this.name + "の攻撃!");
    System.out.println("切りつける!");
    m.getHp();
    System.out.println(m.getName() + "に5ポイントのダメージ!");
    System.out.println("HP:" + m.getHp());
  }
  public String getAttack(Matango m){return this.attack(m);}

  public void run(){
    System.out.println(this.name + "は逃げ出した!");
    System.out.println("HP:" + this.hp); 
  }
}

<Matango.java>

public class Matango { 
  private String name = "お化けキノコ";
  public String getName(){return this.name;}
  public void setName(String name){this.name = name;}

  private int hp = 30;
  public int getHp(){return this.hp;}
  public void setHp(int hp){this.hp = hp;}
}

試したこと

Heroクラスのどこかを直さないといけないのかなんなのか分からなくなってしまいました。

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+3

attackの戻り値がないのに、getAttackでそれを返そうとしているからです。

private void attack(Matango m){
    System.out.println(this.name + "の攻撃!");
    System.out.println("切りつける!");
    m.getHp();  // ← これも不要
    System.out.println(m.getName() + "に5ポイントのダメージ!");
    System.out.println("HP:" + m.getHp());
}

... 

public String getAttack(Matango m){return this.attack(m);}

ゲッターを積極的に使おうとすることは良いことですが、少し履き違えている気がします。
ゲッターでゲットするのは変数であって、単にメソッドを呼び出すときにはそのままでよいのです。

getAttackというメソッドは不要です。外部からattackを直接呼び出して良いでしょう。
その場合、attackのアクセス修飾子をprivateでなくす必要はありますが。

ついでに

ちょっと気になったことを。

  • setterは出来るだけ作らない
    アクセッサはアクセスを必要最低限に制限するためにあるので、出来るだけ絞った方が良いです。
ゲッター セッター
外部から参照されない x x
外部から参照される o x
外部から変更される必要がある o o
  • 必要に応じて抽象的なクラスを導入する
    まだクラスの継承について学習していないのかもしれませんが。
    現状勇者がマタンゴ以外と戦えないので、Monsterクラスがあるといいですね。

質問の仕方について

teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。

投稿 2017/11/22 23:54

編集 2017/11/23 00:06

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/23 01:38

    回答ありがとうございます!とても勉強になります。
    無事に作動させることが出来ました^^
    <code>ボタンもさっそく使って修正しました。

    習ったことを手当たり次第試そうとしてしまいますね汗。

    キャンセル

  • 2017/11/23 01:42

    質問編集の対応感謝します。
    いろいろな機能やノウハウを試してみるのは良いことだと思いますよ。
    なぜそのような書き方が必要なのか?というところまで理解していたら◎です。

    キャンセル

  • 2017/11/23 01:54

    もう一つよろしいでしょうか?

    無事に作動したと思ったらお化けキノコのHPが減っていませんでした。attackはpublicにしてありますが、Matangoはprivateなのでこれはゲッターを利用して呼び出そうとし m.getHp() -= 5; と書いてみましたがエラーメッセージで ”クラス Matangoのメソッド getHpは指定された型に適用できません。 期待値: 引数がありません 検出値: int 理由: 実引数リストと仮引数リストの長さが異なります” とでてしまいました。変数を呼出し、その値を変更するにはどうすれば良いでしょうか?そもそも可能でしょうか?

    キャンセル

  • 2017/11/23 01:58

    getHp()によって返ってくるのはただの数値です。
    ですので、HPが30の場合、m.getHp() -= 5;は30 -= 5;と同じなのでコンパイルエラーになります。
    m.setHp(m.getHp() - 5); と書く必要がありますね。

    キャンセル

  • 2017/11/23 02:00

    ただし、やはり外部からセッターを使うのは出来るだけ避けたいです。
    マタンゴにdamagedメソッドを作った方が綺麗かと思いますよ。
    public void damaged(int damage) {
    this.setHp(this.getHp() - damage);
    }

    キャンセル

  • 2017/11/23 02:01

    セッターはよほど必要性がない限り使わないと思っていいです。

    キャンセル

  • 2017/11/23 02:07

    丁寧な解説ありがとうございます!
    セッターについては参考にしている書籍でもゲッターと比べて説明がサラッとしていてあまり理解できてませんでした。damagedメソッドのバージョンでも試してみたいと思います!
    ありがとうございました!

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

  • 受付中

    明解Java入門編演習9−3

    この演習はDayクラスを使わずに行う演習なのでしょうか? Dayクラスを使うのなら、銀行口座クラスにtoStringメソッドを作る理由が分かりません。 また、もしDayクラスを

  • 受付中

    Javaの質問です。テキストファイルのデータを上書き(部分的に削除)したいです。お力をお貸しください...

    初めて利用させていただきます。 現在私は、テキストファイルを用いるJavaの勉強をしております。 テキストファイルに、コンソールで入力した「name」「job」「sex」を

  • 解決済

    メソッドを使ったプログラムを作りたいです

    前提・実現したいこと Javaのメソッドを使う問題を解いています。 問題は以下の通りです。 ↓ 好物を元に動物の名前と特徴を出力するプログラム  ・作成するクラス 

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

  • 解決済

    ファイルの書き出し

    前提・実現したいこと csvファイルから読み込んだものをソートして別のcsvファイルに書き出しを行いたいです。 発生している問題・エラーメッセージ 書き出しが行われない。

  • 受付中

    ジャンケンゲーム

    ジャンケンゲームを作ってます。 <ルール> コンピュータに3回負けたらゲーム終了! 負けるまでゲームは続く! 数字を入力するとループが止まりません。 あと、winlo

  • 解決済

    あるクラスのフィールドに任意の値を代入して参照したいです

    Heroクラスのattackメソッドでmonster.nameを参照したいのですがデフォルトコンストラクタの初期値であるnullとなってしまい同様にmonster.hpも0となりま

  • 解決済

    継承時のthisの働き

    こんにちは。現在Javaについて勉強しています。 今回はその継承に関して、調べてもよくわからない点があったので質問させてください。 見て頂きたいのは以下のコードです。 clas

同じタグがついた質問を見る

  • Java

    10492questions

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