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

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

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

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

Q&A

解決済

1回答

5025閲覧

NullPointerExceptionの原因が分からないです。

TA-KEY

総合スコア21

Java

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

1グッド

0クリップ

投稿2018/02/07 09:23

編集2018/02/07 11:15

主人公(Heroクラス)の体力を回復するアイテム(RipoDクラス)を使おうとすると、NullPointerExceptionが出ます。エラーコードの意味はわかりますが、なぜ参照先がnullになっているのか分かりません。
アイテムを使うとき、リスト(ItemListクラス)からアイテムの在庫を減らすために、リストを取得するメソッド(getItemListを呼び出しています。エラーメッセージを見ると、このgetItemListの参照先がnullのようです。

コード中に※印を振りました。
※1が最初に呼び出され、その中で※2を呼び、さらにその中で※3を読んだときに参照先、つまりitemListがnullになっているようです。
mainクラスでItemListもRipoDもインスタンス化してるので、コンストラクタで設定されてるaddItemListが呼び出されてnullにはならないと思うのですが。
なぜnullなのか分かりません。よろしくお願いします。
なぜこのようなめんどくさいコードになってるかには触れないでください、、、、。

エラーメッセージ
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Item.RipoD.getStock(RipoD.java:40)//※3
at Item.RipoD.addStock(RipoD.java:31)//※2
at Item.RipoD.use(RipoD.java:25)//※1
at Main.Main.actionPerformed(Main.java:388)//Mainクラスのrd.use(h);の部分

java

1public class ItemList { 2 private String itemList; 3 4 public void ItemList(){ 5 itemList = ""; 6 } 7 8 public String getItemList() { 9 return itemList; 10 } 11 12  public void addItemList(int itemNumber, String itemName, int stock) { 13 if(itemNumber == 1){ 14 itemList = "(" + itemNumber +")" + itemName + ":" + stock + "個\n"; 15 } 16 else{ 17 itemList += "(" + itemNumber +")" + itemName + ":" + stock + "個\n"; 18 } 19 }

java

1public class RipoD implements Item{ 2 private int stock; 3 private String name; 4 private int itemNumber; 5 ItemList item; 6 7 public RipoD() { 8 9 } 10 11 public RipoD(ItemList item){ 12 stock = 0; 13 name = "リポD"; 14 itemNumber = 1; 15 item.addItemList(itemNumber, name, stock); 16 item.addAllItemList(itemNumber, name); 17 item.addIList(name); 18 } 19 20 public void use(Main.Hero h) { 21 System.out.println("ごく、、、ごく、、、ぷはぁっ!\n体力が少し回復した"); 22 h.addHP(30); 23 addStock(-1); //※1 24 } 25 26 public void addStock(int num) { 27 this.stock += num; 28 String after = this.name + ":" + this.getStock() + num; //※2 29 /*item.changStock(this.name + ":" + this.getStock(), after);*/ 30 } 31 32 public int getStock() { 33 String text = item.getItemList(); //※3 34 /*int number2 = text.indexOf("(" + itemNumber + ")"); 35 int number3 = number2 + 2 + this.name.length() + 2; 36 int stock = Integer.parseInt(text.substring(number3, number3 + 1)); 37 this.stock = stock;*/ 38 return stock; 39 }

java

1public class Main extends JFrame implements MouseListener, ActionListener { 2 3 public JTextArea mainArea; 4 Scanner input = new Scanner(System.in); 5 JMenuItem menuitem1; 6 JMenuItem menuitem2; 7 JMenuItem menuitem3; 8 String userName = ""; 9 JTextField tf; 10 JButton bt; 11 Hero h; 12 int year = 2; 13 int mon = 9; 14 int week = 1; 15 Item.ItemList item = new Item.ItemList(); 16 Item.RipoD rd = new Item.RipoD(item); 17 Item.RipoDX rdx = new Item.RipoDX(item); 18 Item.PowerSyo powsyo = new Item.PowerSyo(item); 19 20 public static void main(String args[]){ 21 rd.use(h); 22 } 23 24

字数制限により、関係ないところはコードを消しています。

A-pZ👍を押しています

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

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

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

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

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

LouiS0616

2018/02/07 09:26

エラーについて考察があるのは素晴らしいと思いますが、肝心のエラーメッセージを貼ることをお忘れなく。
TA-KEY

2018/02/07 11:08

分かりました編集します。ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

Main:

Hero h; // <- メンバ変数hが初期化されてないからNull

RipoD:

ItemList item; // <- メンバ変数itemが初期化されてないからNull
public RipoD(ItemList item){ // <- 引数itemはメンバ変数itemと別物 stock = 0; name = "リポD"; itemNumber = 1; item.addItemList(itemNumber, name, stock); // <- これは引数item item.addAllItemList(itemNumber, name); item.addIList(name); }
public int getStock() { String text = item.getItemList(); //※3 上記の理由でこのitemはnull

投稿2018/02/07 09:27

編集2018/02/07 09:32
tkturbo

総合スコア5572

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

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

退会済みユーザー

退会済みユーザー

2018/02/07 11:28

初期化されてないなら利用時でなくコンパイルエラーでは
TA-KEY

2018/02/07 11:30

解答ありがとうございます!メンバ変数itemを初期化しないと、ItemListのコンストラクタは呼び出されないということであってますか?
tkturbo

2018/02/08 03:54

おお、確かに>asahina1979さん
tkturbo

2018/02/08 03:56

RipoDクラスのコンストラクタで「this.item = new ItemList()」とかを書いておく必要があるってことで>TA-KEYさん
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問