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

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

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

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

Q&A

解決済

3回答

1837閲覧

スッキリわかるJava入門 第10章 練習問題 回答でのエラー

revoiot

総合スコア188

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

0グッド

0クリップ

投稿2019/05/05 10:31

編集2019/05/05 12:27

スッキリわかるJava入門という書籍の練習問題を解いていて、
Wandクラス、Wizardクラスについては、練習問題の回答をそのまま書き写したのですが、下記のように、値がnullであると、2個エラーがでてしまいます。

なぜこのようなエラーが起きてしまうのでしょうか?

大変恐れ入りますが、ご教授いただけると助かります。。。。。

Errorcode

1Exception in thread "main" java.lang.NullPointerException 2 at Wizard.heal(Wizard.java from InputFileObject:41) 3 at Main.main(Main.java from InputFileObject:13)

1個目のエラー
int recovPoint = (int) (basePoint * this.getWand().getPower());
2個目のエラー
wizard.heal(h);

Java

1//Mainクラス 2public class Main { 3 public static void main(String[] args) { 4 Hero h = new Hero(); 5 System.out.println(h.getHp()); 6 Wizard wizard = new Wizard(); 7 wizard.heal(h); 8 } 9}

Java

1//Heroクラス 2public class Hero { 3 private String name; 4 private int hp = 10; 5 6 public String getName(){ 7 return this.name; 8 } 9 10 public void setName(String name){ 11 this.name = name; 12 } 13 14 public int getHp(){ 15 return this.hp; 16 } 17 18 public void setHp(int hp){ 19 this.hp = hp; 20 } 21}

Java

1//Wizardクラス 2public class Wizard { 3 private int hp; 4 private int mp; 5 private String name; 6 private Wand wand ; 7 8 public String getName(){ 9 return this.name; 10 } 11 12 public void setName(String name){ 13 this.name = name; 14 } 15 16 public int getHp(){ 17 return this.hp; 18 } 19 20 public void setHp(int hp){ 21 this.hp = hp; 22 } 23 24 public int getMp(){ 25 return this.hp; 26 } 27 28 public void setMp(int mp){ 29 this.mp = mp; 30 } 31 32 public Wand getWand(){ 33 return this.wand; 34 } 35 36 public void setWand(Wand wand){ 37 this.wand = wand; 38 } 39 40 public void heal(Hero h){ 41 int basePoint = 10; 42 int recovPoint = (int) (basePoint * this.getWand().getPower()); 43 h.setHp(h.getHp() + recovPoint); 44 System.out.println 45 (h.getName() + "のHPを" + recovPoint + "回復した!"); 46 } 47}

Java

1//Wandクラス 2public class Wand { 3 private String name; 4 private double power; 5 6 public String getName(){ 7 return this.name; 8 } 9 10 public void setName(String name){ 11 this.name = name; 12 } 13 14 public double getPower(){ 15 return this.power; 16 } 17 18 public void setPower(double power){ 19 this.power = power; 20 } 21}

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

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

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

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

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

guest

回答3

0

質問に記されたのはスタックトレースと呼ばれるものですが、

Main.javaの13行目を実行した

Main.javaの13行目によって呼び出されたWizard.javaの41行目を実行した

それによってNullPointerExceptionという例外が発生した

という一連の流れを示しています。「エラーが2箇所発生した」のではありません。ですから、注目すべきはWizard.javaの41行目がなぜNullPointerExceptionとなるのかということです。

当該行を見ると、

java

1 int recovPoint = (int) (basePoint * this.getWand().getPower());

となっていますが、ここでgetWand()というメソッドを呼び出しています。getWand()は単に自分のメンバー変数として持っているwandを返すだけのものですが、このwandという変数に初期値を代入する処理がどこにも無いので、この行に到達した時点でwandはnullのままです。ですからgetWand()の戻り値はnullです。

それなのに、その戻り値を参照してgetPower()というメソッドを呼び出そうとしています。ですから、ここはnull.getPower()としているのと同じことになります。これがNullPointerExceptionの原因でしょう。

メンバー変数wandには、値をセットするためのsetWand()というメソッドが用意されていますが、参考にした書籍にはそれを呼ぶコードがあるのでありませんか?それが抜けているのだと思います。

投稿2019/05/05 11:43

編集2019/05/05 11:46
keicha_hrs

総合スコア6768

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

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

revoiot

2019/05/05 12:45

大変わかりやすい回答いただきありがとうございました。 これから、wandに初期値を設定してみたり、setwandで値を変えてみたりしてみようと思います。 大変恐れ入りますが、今回はwandのインスタンス化をすすめてくれたAkashicさんをベストアンサーに選ばさせていただきました。
guest

0

ベストアンサー

Exception in thread "main" java.lang.NullPointerException at Wizard.heal(Wizard.java from InputFileObject:41) at Main.main(Main.java from InputFileObject:13)

2個のエラーというか、
Main.java の wizard.heal(h); から呼び出した先
Wizard.java の int recovPoint = (int) (basePoint * this.getWand().getPower());
でエラーになっている意味かと思います。

直接の原因は、this.getWand()のインスタンスが作られておらずnullになっているので、getPower()をする時にNullPointerExceptionになっているように見えます。

書籍の練習問題の回答とのことですので、setWand()している箇所などWand関連で書き漏れが無いか確認してみてはいかがでしょうか?どこかでnew Wand()してsetWand()するのかと予想されます。

単純にNullPointerException回避だけであれば、Wizard .java内でnewするだけでも回避できます。
結局どこかで設定しないとh.getName()もnullになるかと思いますが。

public class Wizard {   … private Wand wand = new Wand();   …

投稿2019/05/05 11:36

Akashic

総合スコア298

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

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

revoiot

2019/05/05 12:41

再度書き漏れがないのか確認しましたが、特にありませんでした。 おそらく、書籍のミスで、wandをインスタンス化する処理が書かれていなかったのだと思われます。 大変わかりやすい回答をしていただきありがとうございました。
guest

0

https://github.com/walkingmask/sukkiri_java/blob/master/10/Wizard.java

によりますと, Wizard クラスのコンストラクタで Wand を設定する(ことになる?)ようです. が, これは古い版かもしれません.

投稿2019/05/05 12:03

jimbe

総合スコア12632

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

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

revoiot

2019/05/05 12:29

ご回答いただきありがとうございます。 私が持っている参考書のバージョンの回答では、Wizard クラスのコンストラクタの記述はありませんでした。 おそらく、参考書の回答の不足によるものだと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問