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

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

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

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

Q&A

解決済

2回答

540閲覧

Main.javaを実行するとエラーが出てコード自体が実行できない

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/07/26 01:57

eclipseでスッキリわかるJava入門実践編を勉強しています。
以下の3つのコードがlist04-09にあります。Main.javaを実行すると
実行結果は

装備:はがねの剣
clone()で複製します
コピー元の勇者の剣の名前を変えます
コピー元とコピー先の勇者の装備を表示します
コピー元:ひのきの棒/コピー先:ひのきの棒

となるはずですがエラーが出て実行できません。
エラーメッセージは

Exception in thread "main" java.lang.NullPointerException
at sample.list04_09.Main.main(Main.java:10)

です。
実行できるように直してもらえませんか。

list04-09 Main.java public class Main { public static void main(String[] args) { Hero h1 = new Hero("ミナト"); Sword s = new Sword("はがねの剣"); System.out.println("装備:" + h1.getSword().getName()); System.out.println("clone()で複製します"); Hero h2 = h1.clone(); /* ここで複製 */ System.out.println("コピー元の勇者の剣の名前を変えます"); h1.getSword().setName("ひのきの棒"); System.out.println("コピー元とコピー先の勇者の装備を表示します"); System.out.println("コピー元:" + h1.getSword().getName() + "/コピー先:" + h2.getSword().getName()); } }
list04-09 Hero.java public class Hero implements Cloneable { String name; // 名前 int hp; // HP Sword sword; // 装備している武器 public Hero clone() { Hero result = new Hero(name); result.name = this.name; result.hp = this.hp; result.sword = this.sword; return result; } public Hero(String name) { this.name = name; } public Sword getSword() { return sword; } public void setSword(Sword sword) { this.sword = sword; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
list04-09 Sword.java public class Sword { private String name; public Sword(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

Swordを作成しましたが、作成しただけでHeroのh1がそれを持っていません。そのため、h1.getSword()がnullを返します。このnullに対してgetName()したので、ヌルポで落ちます。

この操作の前にh1.setSword()する必要があります。

投稿2018/07/26 02:02

swordone

総合スコア20649

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

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

退会済みユーザー

退会済みユーザー

2018/07/26 02:24

ありがとうございます。 Sword s = new Sword("はがねの剣");のしたに h1.setSword(s); で実行できました。 深いコピーをしたいとおもいます。
退会済みユーザー

退会済みユーザー

2018/07/26 02:26

ありがとうございました。 Sword s = new Sword("はがねの剣");の次に h1.setSword(s)を追加して無事に実行できました。
guest

0

Hero が生成された時、まだ Sword は持っていません。
(Hero のコンストラクタで Sword を初期化していない)

その状態で getSword() しても「空」なので、それの名前にアクセスすることが出来ません。
よって、getName() した時点でこのエラーになります。

なので、Hero を生成した後に Sword を Hero に装備させてやる(setSword())必要があります。

投稿2018/07/26 02:01

tacsheaven

総合スコア13703

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

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

退会済みユーザー

退会済みユーザー

2018/07/26 02:28

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問