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

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

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

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

Q&A

解決済

3回答

1619閲覧

コンポジションの学習練習をしています。模範回答と同じように書いたのにエラーが出てしまいました。

talabagani

総合スコア50

Java

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

0グッド

0クリップ

投稿2021/07/05 14:40

編集2021/07/05 22:16

#[環境]
Java version 16.0.1
VS Code
Mac OS Big Surの環境です。
java -version
java version "16.0.1" 2021-04-20
Java(TM) SE Runtime Environment (build 16.0.1+9-24)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)
MacBook:09_MinutesToYearsandDayCalculator $

パソコン MacBook(Retina, 12-inch,2017), memory 8GB

#[エラー]
MacBook:37_Composition $ javac Main.java
MacBook:37_Composition $ java Main

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Bed.make()" because "this.bed" is null
at Bedroom.makeBed(Bedroom.java:14)
at Main.main(Main.java:15)

MacBook:37_Composition $

エラーはコンパイルの後に出ました。

#[学習状況]
2021年5月中旬から独学でJavaを学習しはじめました。
progateを3巡、ドットインストール1巡、スッキリJavaの本を8割読みました。現在、UdemyのJava Programming Masterclass for Software Developersというコースで動画を見たり、演習問題に取り組んでいます。
この問題はUdemyでの演習35番目なので、まったくの初めてというわけではありません。
まだまだ初心者ですが真面目に取り組んでいるので、何卒、よろしくお願いします。

#[演習問題の内容]
コンポジションの学習をしましょう。
クラスを5つ作ります。

Bed,Ceiling,Lamp,Wall、 
そしてこれらのクラスを取り込んだBedroomというクラスです。

#[わからない事]
BedroomクラスのmakeBed()メソッドを呼んでいるところでエラーがでています。
模範解答も同じようにコードを書いており、何が問題なのかわかりません。

#[自分コード]

java

1public class Main { 2 public static void main(String[] args) { 3 4 Wall wall1= new Wall("West"); 5 Wall wall2= new Wall("East"); 6 Wall wall3= new Wall("South"); 7 Wall wall4= new Wall("North"); 8 9 Ceiling ceiling = new Ceiling(12,55); 10 Bed bed = new Bed ("Modern", 4,3,2,1); 11 Lamp lamp = new Lamp("Classic", false, 75); 12 13 Bedroom bedRoom = new Bedroom("Roba room", wall1, wall2, wall3, wall4, 14 ceiling, bed, lamp); 15 bedRoom.makeBed(); 16 17 bedRoom.getLamp().turnOn(); 18 } 19 20}

java

1public class Bedroom { 2 private String name; private Wall wall1; private Wall wall2; private Wall wall3; 3 private Wall wall4; private Ceiling ceiling; private Bed bed; private Lamp lamp; 4 5 public Bedroom(String name, Wall wall1, Wall wall2, Wall wall3, Wall wall4, 6 Ceiling ceiling, Bed bed, Lamp lamp){ 7 this.name=name; this.wall1=wall1; this.wall2=wall2; this.wall3=wall3; 8 this.wall4=wall4; this.lamp=lamp; 9 } 10 public Lamp getLamp() { 11 return lamp; 12 } 13 public void makeBed(){ 14 bed.make(); 15 System.out.println("Bedroom -> Making bed | "); 16 } 17}

java

1public class Bed { 2 private String style; private int pillow;private int height; 3 private int sheets;private int quilt; 4 5 public Bed(String style,int pillow,int height,int sheets,int quilt){ 6 this.style=style;this.pillow=pillow;this.height=height; 7 this.sheets=sheets;this.quilt=quilt; 8 } 9 public void make(){ 10 System.out.println("Bed -> Making | "); 11 } 12 public String getStyle() { 13 return style; 14 } 15 public int getPillow() { 16 return pillow; 17 } 18 public int getHeight() { 19 return height; 20 } 21 public int getSheets() { 22 return sheets; 23 } 24 public int getQuilt() { 25 return quilt; 26 } 27} 28 29

java

1public class Ceiling { 2 private int height; 3 private int paintedColor; 4 5 public Ceiling(int height,int paintedColor){ 6 this.height=height; 7 this.paintedColor=paintedColor; 8 } 9 public int getHeight() { 10 return height; 11 } 12 public int getPaintedColor() { 13 return paintedColor; 14 } 15 16} 17 18

java

1public class Lamp { 2 private String style; 3 private boolean battery; 4 private int globRating; 5 6 public Lamp(String style,boolean battery,int globRating){ 7 this.style=style; 8 this.battery=battery; 9 this.globRating=globRating; 10 } 11 public void turnOn(){ 12 this.battery=true; 13 System.out.println("Lamp -> Turning on"); 14 } 15 public boolean isBattery(){ 16 return battery; 17 } 18 public String getStyle() { 19 return style; 20 } 21 public int getGlobRating() { 22 return globRating; 23 } 24} 25 26

java

1public class Wall { 2 private String direction; 3 4 5 public Wall(String direction){ 6 this.direction=direction; 7 } 8 9 public String getDirection() { 10 return direction; 11 } 12 13} 14 15

#[ネットで見つけた模範回答コード]

java

1public class Bedroom { 2 private String name; 3 private Wall wall1; 4 private Wall wall2; 5 private Wall wall3; 6 private Wall wall4; 7 private Ceiling ceiling; 8 private Bed bed; 9 private Lamp lamp; 10 11 public Bedroom(String name, Wall wall1, Wall wall2, Wall wall3, Wall wall4, Ceiling ceiling, Bed bed, Lamp lamp) { 12 this.name = name; 13 this.wall1 = wall1; 14 this.wall2 = wall2; 15 this.wall3 = wall3; 16 this.wall4 = wall4; 17 this.ceiling = ceiling; 18 this.bed = bed; 19 this.lamp = lamp; 20 } 21 22 public Lamp getLamp() { 23 return lamp; 24 } 25 26 public void makeBed(){ 27 System.out.println("Bedroom -> Making bed | "); 28 bed.make(); 29 } 30} 31 32public class Wall { 33 private String direction; 34 35 public Wall(String direction) { 36 this.direction = direction; 37 } 38 39 public String getDirection() { 40 return direction; 41 } 42} 43 44 45public class Ceiling { 46 private int height; 47 private int paintedColor; 48 49 public Ceiling(int height, int paintedColor) { 50 this.height = height; 51 this.paintedColor = paintedColor; 52 } 53 54 public int getHeight() { 55 return height; 56 } 57 58 public int getPaintedColor() { 59 return paintedColor; 60 } 61} 62 63 64public class Bed { 65 private String style; 66 private int pillows; 67 private int height; 68 private int sheets; 69 private int quilt; 70 71 public Bed(String style, int pillows, int height, int sheets, int quilt) { 72 this.style = style; 73 this.pillows = pillows; 74 this.height = height; 75 this.sheets = sheets; 76 this.quilt = quilt; 77 } 78 79 public void make(){ 80 System.out.println("Bed -> Making | "); 81 } 82 83 public String getStyle() { 84 return style; 85 } 86 87 public int getPillows() { 88 return pillows; 89 } 90 91 public int getHeight() { 92 return height; 93 } 94 95 public int getSheets() { 96 return sheets; 97 } 98 99 public int getQuilt() { 100 return quilt; 101 } 102} 103 104 105public class Lamp { 106 private String style; 107 private boolean battery; 108 private int globRating; 109 110 public Lamp(String style, boolean battery, int globRating) { 111 this.style = style; 112 this.battery = battery; 113 this.globRating = globRating; 114 } 115 116 public void turnOn(){ 117 System.out.println("Lamp -> Turning on"); 118 } 119 120 public String getStyle() { 121 return style; 122 } 123 124 public boolean isBattery() { 125 return battery; 126 } 127 128 public int getGlobRating() { 129 return globRating; 130 } 131}

#[スクリーンショット]
イメージ説明
イメージ説明
イメージ説明
イメージ説明

イメージ説明

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

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

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

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

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

guest

回答3

0

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Bed.make()" because "this.bed" is null

Bedroomクラス内にはbedと言う名前のフィールドがありますが、宣言されているだけでどこでもインスタンス化されておらず、すなわちデフォルト値のnullのままです。makeBedメソッドでnullのままmakeを呼び出そうとしているので、「Cannot invoke "Bed.make()" because "this.bed" is null」、「this.bednullなのでBed.make()を呼び出せませんよ。」とそのままの意味でエラーメッセージは伝えています。

模範解答の方のコードではBedroomのコンストラクタ内で this.bed = bed;としているのでBedroomのインスタンスの参照がセットされるかたちですが、質問者talabaganiさんのものではそうはなっていません。もう一度目を皿のようにし、それでも分からなければエディターなどの力も借りて再確認してみてください。

投稿2021/07/05 15:06

dodox86

総合スコア9256

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

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

dodox86

2021/07/05 15:17

「同じように書いた(はず)」と言うのは本人の主観でしかないので、模範解答のテキストをコピー&ペーストできるようであればそれをファイルに保存し、自分のファイルと比較用のツールを使って(macOSのターミナルのコマンドで言うとdiffなど)突き合せ、照合するくらいの意気込みでやっても良いと思います。
talabagani

2021/07/05 22:21

diffコマンドというものがあるんですね。 便利ですね。 早速使ってみようとして、5つに別れていたファイルを一つまとめてf1.javaとしました。そして模範回答もf2.javaとしました。ターミナルに diff f1.java f2.javaといれてみました。わーとたくさん返ってきたのですが、比較してくれているように見えません。使い方あっていますか? もっとシンプルなテキストエディタに貼ってもう一度やってみました。今度はff1 ff2というファイル名前にしてみました。コマンドを打つと、なんと、なんの反応もありませんでした。 その時の様子をスクリーンショットで追加しました。
dodox86

2021/07/06 00:48 編集

ターミナルのdiffコマンドは常に使える汎用的な「ファイル比較」ツールの一例として挙げたものでしたが、macOS含むUN*Xのターミナルでのコマンド操作に慣れていない方にとっては最初はちょっと(かなり)面喰うものであったかもしれません。双方のファイルに大きく差があるとそれはそれで確認が大変です。その点、取り上げたことは不適当だったかもしれませんが、diffの出力はteratailでも「ここが違いますよ」と回答で指摘するときにも使われることがあるので、覚えておくと良いです。時間のある時にでも「1. 同じファイルであったらどうなるのか」「2. 少しだけファイルであったらどうなるのか」を試してみて慣れておくことをお勧めします。 Visual Studio Codeを使っているのであれば、Visual Studio Codeと言うエディター自体がもともと内蔵しているファイル比較機能が使えるはずです。恐らくこちらの方が段違いに見易いはずです。「Visual Studio Code diff」などとキーワード検索してみてください。 コメントの当初の主旨としては、「目視で確認してOKであったというのは主観による自己申告でしかないことを理解し、"比較"と言う機能に特化したツールを使って確実に確認しましょう。」と言うことです。空白の有無を無視する、違う部分を色分け表示する、など、知っておくと得しかありません。 [一部誤記修正]
dodox86

2021/07/06 00:22

[2021/07/06 07:21]のコメントより: > わーとたくさん返ってきたのですが、比較してくれているように見えません。 わーっと出力されたときは何らかの違いがあったときです。何も出力されないのは何の違いも無いときです。
kazuma-s

2021/07/06 00:44

> diff f1.java f2.javaといれてみました。わーとたくさん返ってきたのですが、 diff -u -b -w f1.java f2.java と入れてみてください。どうなりますか?
talabagani

2021/07/06 06:52

少しだけ違うファイルを用意してdiffコマンドを使ってみました。こんな具合に表示されると理解することができました。 Visual Studio Code diff 早速使ってみました。とてもみやすくて便利なので、 これから使うようにしようと思います。 ありがとうございます。
talabagani

2021/07/06 06:55 編集

diff -u -b -w f1.java f2.java と入れてみると、わーとたくさん出てきました。+ や-が表示されています。-は元のファイルにしかないものなんですよね。これはみやすくて便利ですね。ありがとうございます。
guest

0

Bedroomのコンストラクタでbedは引数として渡されてますが自身のフィールドにセットされてません。
宣言だけされてるのでnullです。nullからmakeを呼び出そうとして出ているNullPointerException。

コードインデントやフォーマットが滅茶苦茶なので分かりづらくなってるのでは。
コードフォーマット掛ければ多少は見やすくなりますよ。

java

1public class Bedroom { 2 private String name; 3 private Wall wall1; 4 private Wall wall2; 5 private Wall wall3; 6 private Wall wall4; 7 private Ceiling ceiling; 8 private Bed bed; 9 private Lamp lamp; 10 11 public Bedroom(String name, Wall wall1, Wall wall2, Wall wall3, Wall wall4, 12 Ceiling ceiling, Bed bed, Lamp lamp) { 13 this.name = name; 14 this.wall1 = wall1; 15 this.wall2 = wall2; 16 this.wall3 = wall3; 17 this.wall4 = wall4; 18 this.lamp = lamp; 19 } 20 21 public Lamp getLamp() { 22 return lamp; 23 } 24 25 public void makeBed() { 26 bed.make(); 27 System.out.println("Bedroom -> Making bed | "); 28 } 29}

投稿2021/07/05 15:05

m.ts10806

総合スコア80875

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

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

talabagani

2021/07/05 21:51

インテンド、それなりに気をつけていたんですが、めちゃくちゃですか、、、 (スクリーンショットでは、一つの画面に全てのコードが入るように場所を節約してちょっとインテンドがおかしくなっています。) コードフォーマットなるもの、初めて知りました。早速、ちょっと調べてみてVSCodeにPrettierという拡張機能を入れてみました。設定がいまいち話からず現在苦戦中ですが、調べて使えるようにしたいと思います。 初心者的にはテキストエディタを使えるようにするのがハードルが高いです。 最近も、スニペットのカスタマイズ設定がわからず、こちらで大変お世話になってどうにか使えるようにしたばかりです。
m.ts10806

2021/07/05 22:33 編集

>インテンド、それなりに気をつけていたんですが、めちゃくちゃですか、、、 変数宣言や代入が横に並んでる時点で「あー」ってなります。 私が回答に提示したフォーマット後のコード見るとその違いは明白かと思います。 Javaならeclipse使った方が楽です。特に凝った設定もプラグインもなくフォーマット機能があります。
m.ts10806

2021/07/05 22:35

いずれにしても、要件を満たすことではなく「お手本のとおりに」を目指すから出来ません。そこは認識してください。目的は書籍やお手本の通りにすることではないですよね。 今書いているコードが何を実現するものかなぜ作られるものなのか常に考えて作ってください。
dodox86

2021/07/05 23:58

@質問者さん 字下げはインテンド(intend)ではなく、インデント(indent)です。 初心の頃は敷居が高いかもしれませんが、コードの書き方には好み、プログラミング言語ごとに差異はあるものの一般的な「標準(coding standardなどと呼ばれる)」があって、そうしたものに沿って書いていくと、世間で読み易いと言われるかたちに収束していきます。エディターの書式整形機能もそういうものに沿っていることが多いです。余裕ができたらそういったものにも目を向けていくと良いと思います。 https://github.com/future-architect/coding-standards/blob/master/documents/forJava/Java%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84.md
talabagani

2021/07/06 08:53

リンクありがとうございます。 読んで取り入れられるものは早速取り入れて書くようにしようと思います。 ありがとうございました。
m.ts10806

2021/07/06 09:09

もちろんコードの可読性は重要ですが、質問者さんの場合はコードを書くことが目的になっている部分の改善が最優先と思います。
guest

0

ベストアンサー

エラー文に「 "this.bed" is null」って書いてありますよね?

diff

1public class Bedroom { 2 private String name; private Wall wall1; private Wall wall2; private Wall wall3; 3 private Wall wall4; private Ceiling ceiling; private Bed bed; private Lamp lamp; 4 5 public Bedroom(String name, Wall wall1, Wall wall2, Wall wall3, Wall wall4, 6 Ceiling ceiling, Bed bed, Lamp lamp){ 7 this.name=name; this.wall1=wall1; this.wall2=wall2; this.wall3=wall3; 8 this.wall4=wall4; this.lamp=lamp; 9+ this.bed=bed; 10 }

投稿2021/07/05 15:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

talabagani

2021/07/05 23:01

ありがとうございます。 ちなみにこちらdiffコマンドで比較したものですか?
Zuishin

2021/07/05 23:13

高評価していましたが、質問者の次の一言で外しました。 > ちなみにこちらdiffコマンドで比較したものですか?
退会済みユーザー

退会済みユーザー

2021/07/06 11:43

>ちなみにこちらdiffコマンドで比較したものですか? いいえ。diffを使うまでもなく、回答に書いてある通り「"this.bed" is null」というエラー文からの判断です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問