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

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

ただいまの
回答率

88.04%

別クラスのデータを取ってきたいのですがnullになってしまう

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 735

score 6

前提・実現したいこと

hit&blowのゲームを製作しています。スコア部分の表示で困っています。

発生している問題・エラーメッセージ

ゲームクリア後の表示に最初に入力した名前と現在の日付、ゲームクリア時刻を表示したいのですが現状nullになってしまいデータが表示されません。
まだ知識が浅く理解できない部分もあるかもしれませんが宜しくお願い致します。

該当のソースコード

package game;

import java.util.Arrays;
import java.util.Scanner;
public class MathGame {
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        System.out.println("名前を入力してください");
        Score score = new Score();
        String name = score.getName();
        System.out.println("ゲームを始めます");
        int answer[] = new int[4];
        answer[0] = (int) (Math.random() * 9) + 1;
        for (int i = 1; i < answer.length; i++) {
            int num = -1;
            for (boolean isNotExist = false; !isNotExist;) {
                num = (int) (Math.random() * 10);
                isNotExist = true;
                for (int j = 0; j < answer.length; j++) {
                    if (answer[j] == num) {
                        isNotExist = false;
                        break;
                    }
                }
            }
            if (num < 0) {
                throw new IllegalStateException();
            }
            answer[i] = num;
        }
        Arrays.stream(answer).forEach(System.out::println);

        int input[] = new int[4];
        int count = 1;
        while (true) {
            System.out.println("4文字の数字を入力してください");
            String sc = new Scanner(System.in).nextLine();
            boolean error = false;
            int length = sc.length();
            if (length != 4) {
                error = true;
            }
            for (int i = 0; i < length; i++) {
                char c = sc.charAt(i);
                if (c < '0' || c > '9') {
                    error = true;
                }
            }
            for (int i = 0; i < length; i++) {
                for (int j = i + 1; j < length; j++) {
                    if (sc.charAt(i) == sc.charAt(j)) {
                        error = true;
                    }
                }
            }
            if (error == true) {
                System.out.println("4桁の数値を入力してください");
                continue;
            }
            for (int i = 0; i < length; i++) {
                input[i] = Integer.parseInt(sc.substring(i, (i + 1)));
            }
            int hit = 0;
            for (int i = 0; i < 4; i++) {
                if (input[i] == answer[i]) {
                    hit++;
                }
            }
            int Exist = 0;
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (input[i] == answer[j]) {
                        Exist++;
                    }
                }
            }
            if (hit == 4) {
                System.out.println("正解です" + count + "回目で正解です");
                System.out.println(" ");
                break;
            } else {
                System.out.println("hit" + hit + "個、Exist" + (Exist - hit) + "個");
                count++;
            }
        }
                        System.out.println(score.getClearTime() + name + score.getPlayDate());
    }
}
package game;

import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

/**
 * ゲームのスコアを保持するクラス
 */
public class Score {

    /** プレイヤー名 */
    private String name;

    /** カウント数 */
    private int count = 0;

    /** プレイ日時 */
    private Date playDate;

    /** クリア時間(ミリ秒) */
    private long clearTime;

    /** ゲーム開始時刻(ミリ秒) */
    private long startTime;

    /**
     * プレイヤー名を取得します
     *
     * @return プレイヤー名
     */
    public String getName() {
        return this.name;
    }

    /**
     * プレイヤー名を設定します
     *
     * @param name プレイヤー名
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * カウント数を取得します
     *
     * @return カウント数
     */
    public int getCount() {
        return this.count;
    }

    /**
     * カウント数を設定します
     *
     * @param count カウント数
     */
    public int setCount(int count) {
        return this.count = count;
    }

    /**
     * プレイ日時を取得します
     *
     * @return プレイ日時
     */
    public Date getPlayDate() {
        return this.playDate;
    }

    /**
     * プレイ日時を設定します
     *
     * @param date プレイ日時
     */
    public void setPlayDate(Date date) {
        this.playDate = date;
    }

    /**
     * カウント数をインクリメントします
     */
    public void incrementCount() {
        this.count++;
    }

    /**
     * クリア時間を取得します
     *
     * @return クリア時間(ミリ秒)
     */
    public long getClearTime() {
        return this.clearTime;
    }

    /**
     * クリア時間を設定します
     *
     * @param clearTime クリア時間
     */
    public void setClearTime(long clearTime) {
        this.clearTime = clearTime;
    }

    /**
     * ゲームスタート処理を行い、初期化されたスコアオブジェクトを取得します
     *
     * @param name プレイヤー名
     */
    public static Score startGame(String name) {
        Score score = new Score();
        score.setName(name);
        score.setCount(0);
        score.startTime = System.currentTimeMillis();
        return score;
    }

    /**
     * ゲームを終了し、このスコアオブジェクトを終了状態にします
     */
    public void endGame() {
        final Date date = new Date();
        this.setPlayDate(date);
        this.setClearTime(date.getTime() - this.startTime);
    }

    Scanner sc = new Scanner(System.in);
    String name1 = sc.next();
    Calendar cTime = Calendar.getInstance();
    {
        System.out.println("" + cTime.get(Calendar.HOUR_OF_DAY) + "時");
        System.out.println("" + cTime.get(Calendar.MINUTE) + "分");
        cTime.set(Calendar.HOUR_OF_DAY, 23);
        cTime.set(Calendar.MINUTE, 59);
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

Name を name にしてみては?

Score で時分を表示している static イニシャライザに name = name1; を追加してみてください。
Score の
System.out.println("" + cTime.get(Calendar.HOUR_OF_DAY) + "時");
の前に name = name1; ですよ。

時間が null になることの修正は。

MathGame.java の
Score score = new Score(); を
Score score = Score.startGame(); に変更。
System.out.println(score.getClearTime() + name  + score.getPlayDate());
の前に score.endGame(); を追加。

Score.java の
public static Score startGame(String name) { を
public static Score startGame() { に変更。
score.setName(name); を
score.setName(score.name); に変更。

最後の変更は、score.setName を削除でした。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/24 11:52

    すいません。元々nameでした。こちらに移す時間違えたようです修正しときます

    キャンセル

  • 2020/03/24 11:53

    すみません。私も早とちりでした。null の件、調べてみます。

    キャンセル

  • 2020/03/24 12:57

    追加したのですが名前は表示されません。わざわざすいません。

    キャンセル

  • 2020/03/24 13:14

    出来ました!丁寧に教えてくださりありがとうございます!

    キャンセル

0

Scoreにnameを設定するのはsetNameかstartGameなのですが、mainメソッドでそのいずれも呼び出されていません。そのため初期値のnullのままになっています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

MathGame.java

Score score = new Score();
String name = score.getName();


Score.java

  public String getName() {
    return this.name;
  }


ですので, score の name は null です.

Score クラスの最後にある

  Scanner sc = new Scanner(System.in);
  String name1 = sc.next();
  Calendar cTime = Calendar.getInstance();
  {
    System.out.println("" + cTime.get(Calendar.HOUR_OF_DAY) + "時");
    System.out.println("" + cTime.get(Calendar.MINUTE) + "分");
    cTime.set(Calendar.HOUR_OF_DAY, 23);
    cTime.set(Calendar.MINUTE, 59);
  }


が動作しているようですが, sc.next は name1 に入れており, name ではありません.
なお, この書き方はとても気持ち悪いものです.
初期処理であればコンストラクタとするか, 普通のメソッドにしては如何でしょうか.

もう少し細かく言えば, 点数がプレイヤー名を持つというのは変ではありませんか.
通常はプレイヤーが点数を持つべきで, Score クラスに name で無く Player クラスに name と点数(ついでにプレイ時間も...は微妙かもしれません)というのがしっくりくるように思います.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る