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

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

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

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

NullPointerException

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

Java

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

Q&A

解決済

2回答

754閲覧

NullPointerException Java

coala

総合スコア8

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

NullPointerException

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

Java

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

0グッド

0クリップ

投稿2021/04/06 07:45

メインクラスで以下のコードを走らせた時にエラー(NullPointerException)が出てしまいます。
その解消としてPizzaOrderクラスのcalcTotal()メソッドの中でnullを感知したら0をトータルに足すようにしてエラーの解消を図りましたがうまくいきませんでした。
なにが問題でしょうか。

double total = order.calcTotal();

PizzaOrder class

package Pra3_4; public class PizzaOrder { private Pizza[] pizzas = new Pizza[3]; /* public PizzaOrder(Pizza[] pizzas) { this.pizzas = pizzas; } */ public void setPizzas(Pizza newPizza, int index) { pizzas[index] = newPizza; } public Pizza[] getPizzas() { return pizzas; } public double calcTotal() { double total = 0.0; for(int i = 0; i < pizzas.length; i++) { if(pizzas[i] == null) total += 0; total += pizzas[i].calcCost(); } return total; } @Override public String toString() { String orderlist = ""; for(int i = 0; i < pizzas.length; i++) { orderlist += pizzas[i]; } return orderlist; } /* public int getNumPizzas() { } */ }

Main class

package Pra3_4; import java.util.Arrays; /* * Using your pizza code that you previously completed last week. * Create a PizzaOrder class that allows up to three pizzas * to be saved in an order. * Each pizza saved should be a Pizza object * (you have already written this). * In addition to appropriate instance variables and constructors, * add the following methods: * public void setNumPizzas(int numPizzas) * - sets the number of pizzas in the order, * numPizzas must be between 1 and 3. * • public void setPizza1(Pizza pizza1) - set pizza 1 * • public void setPizza2(Pizza pizza2) - set pizza 2 * • public void setPizza3(Pizza pizza3) - set pizza 3 * • public double calcTotal() - returns the total cost of the order * Write a main method to test the class. * The setPizza2 and setPizza3 methods will be used * only if there are two or three pizzas in the order, respectively. * Sample code illustrating the methods is shown below. * Note the first three lines are incomplete. * You must complete them on your own. * Pizza pizza1 = //code to create a large pizza, 1 cheese 1 ham * Pizza pizza2 = //code to create a medium pizza, 2 cheese, 2 pepperoni * PizzaOrder order = //Code to create an order * order.setNumPizzas(2); // 2 pizzas in the order * order.setPizza1(pizza1); //set first pizza * order.setPizza2(pizza2);//set second pizza * double total = order.calcTotal(); //should be 18+20 = 38 */ public class Main { public static void main(String[] args) { Pizza pizza1 = new Pizza("large", 1, 0, 1); Pizza pizza2 = new Pizza("medium", 2, 2, 0); PizzaOrder order = new PizzaOrder(); order.setPizzas(pizza1,2); order.setPizzas(pizza2,0); Pizza[] list2 = order.getPizzas(); System.out.println(Arrays.toString(list2)); for(int i = 0; i < list2.length; i++) { System.out.println(list2[i]); } double total = order.calcTotal(); System.out.printf("Pizza Order total cost $%.2f\n", total); } }

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

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

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

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

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

guest

回答2

0

calcTotal() メソッド内で

java

1if(pizzas[i] == null) 2 total += 0; 3total += pizzas[i].calcCost();

と書かれていますが、continue がないので null に対しても calcCost() が呼び出されると思います。

投稿2021/04/06 07:51

coolwind0202

総合スコア708

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

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

coala

2021/04/06 08:15

早々にご回答ありがとうございます。なぜContinueが必要なのでしょうか。私の中でpizzas[i]がnullをさすとtotalnに0を足し、そして次のループ(i+1)にいきpizzas[i+1]がnullじゃなければ.calcCost()メソッドが動くと思いました。理解が間違っていますか?
coolwind0202

2021/04/06 09:30

およそ合っています。 しかし、null のときに total に 0 を加算したあと、すぐに次のループに移るわけではないですよね? continue を記述すれば次のループへすぐに移りますが…。 このままだと次のループに行く前に calcCost() が呼び出されます。 continue や、あなたの示した if - else などで、 calcCost() メソッドを呼び出さないように構成する必要があります。
guest

0

自己解決

elseを使いすることで問題が解決しました。
pizzaOrder class

public double calcTotal() { double total = 0.0; for(int i = 0; i < pizzas.length; i++) { if(pizzas[i] == null) total += 0; else total += pizzas[i].calcCost(); } return total; }

投稿2021/04/06 08:18

coala

総合スコア8

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

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

momon-ga

2021/04/06 13:09 編集

> 私の中でpizzas[i]がnullをさすとtotalnに0を足し、そして次のループ(i+1)にいきpizzas[i+1]がnullじゃなければ.calcCost()メソッドが動くと思いました。理解が間違っていますか? 中カッコつけるクセをつけた方が、勘違いが減ると思います。 とはいえ、勘違いなので、質問のコードを見てNullPointer発生することに気づく人の方が多いとは思います。 あとは、if文の判定を逆にして if(pizzas[i] != null) total += pizzas[i].calcCost(); の1行で記述すれば勘違いを減らせるかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問