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

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

ただいまの
回答率

90.62%

  • Java

    13467questions

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

java while文 if文において変数宣言と初期値について

解決済

回答 3

投稿

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

gomakasu423

score 8

お世話になっております。

秀和システムのjava入門書籍にて独習中です。

教科書の章末演習に手こづっており質問をするに至りました。どうかご教授下さいませ。

問いはキーボードをタイプして1~12までのいずれかの値を入力しその値に対応する季節を
表示するプログラムを作成するという問題に対して下記にプログラムしました。

package Pass;
import lib.Input;
public class Pass10_03_1 {
    public static void main(String[] args) {
        int m;
        String s="";
        while ((m=Input.getInt())!=0){
            if(m==12||m==1||m==2){
                s="冬";
            }else if(m==3||m==4||m==5){
                s="春";
            }else if(m==6||m==7||m==8){
                s="夏";
            }else if(m==9||m==10||m==11){
                s="秋";
            }else{
                s="?";
            }
        System.out.println(s);
        }
    }
}
変数宣言でString s="";と書いてありますが、
始めはString S;と書きました。
しかし、最後にSystem.out.println(s)としたところ、初期化されてなく文法エラーとなりました。

そこでString s="";としたらイメージ通りに表示されたのですが、
なんとなく腑に落ちない感じがします。
数字ならば始めの値が重要だと思いますが文字列だからいいような気がいたします。
もしかしたら、変な覚え方してますでしょうか。
ぜひともご教授よろしくお願いいたします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

ご提示のコードの場合、sを初期化しなくてもエラーは発生しないように思います。
ひょっとして最初は次のように書いたのではないでしょうか?

package Pass;
import lib.Input;

public class Pass10_03_1 {
    public static void main(String[] args) {
        int m;
        String s;                // 初期化しないで、
        while ((m=Input.getInt())!=0){
            略
        // System.out.println(s);   こっちじゃなくて
        }
        System.out.println(s);   // こっちに書いたのでは?
    }
}

このとき、while文の条件がいきなり偽である場合は、sが一回も初期化されません
初期化されていない変数を出力するわけにはいきませんから、エラーです。


なお、Stringは参照型なので、nullで初期化しても構いません。
ただし、ヌルポを踏むリスクも抱えることになりますのでご注意を。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/10 22:02

    この件で調べていて知ったのですが、「System.out.print(null)」は「null」と表示されるんですね。

    キャンセル

  • 2018/05/10 22:03

    ありがとうございます!
    おっしゃる通りでした。
    while文の外側だと初期化されていないからエラーなんですね。

    キャンセル

+1

しかし、最後にSystem.out.println(s)としたところ、初期化されてなく文法エラーとなりました。

はい、System.out.println(s)を、ループを抜けた最後に置いた場合、whileループを1度も通らなければ、最後の行に未初期化のままでたどり着いてしまうので、エラーとなります。

上のコードのように、ループの中でしかsを参照しないのであれば、未初期化でたどり着くことはないので、初期化しなくても動作はします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/10 22:05

    ご丁寧にありがとうございます。

    キャンセル

0

参考書の意図は、if 文の練習なのだとおもいますが、
if ... else if ... が長く続くのをプログラマは好みません。

それを避ける方法はいろいろあります。
参考としてその一つを示します。

public class Pass10_03_1 {
    public static void main(String[] args) {
        String seasons[] = {
                "冬", "冬", "春",
                "春", "春", "夏",
                "夏", "夏", "秋",
                "秋", "秋", "冬"
        };

        // while ((m = Input.getInt()) != 0) {
        for (int i = 0; i <= 13; i++) {
            String s;
            if ( 1 <= i && i <= seasons.length ) {
                s = seasons[i - 1];
            } else {
                s = "?";
            }
            System.out.print(s);
        }
        System.out.println();
    }
}

コードで制御する代わりに、データ文で制御させているのです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 受付中

    プログラムソースを教えて欲しいです

    前提・実現したいこと しりとりプログラムを作ろうとしています。 CSVデータ中の情報を読み込みデータ内の単語のみでしりとりを行います。 ルールとして ・CPUとの対戦型

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

  • 解決済

    javaで作れる学習プログラムってどのようなものが作れますか

    意図 javaを使って学習プログラムを作成してほしいといわれました。 しかし、イメージがわきません。 どんなものが作れるのでしょうか

  • 解決済

    ループ文の終了について

    数当てゲームで正解した時にプログラムを終了させたいのですが終わることができません。 初歩的なことで申し訳ありませんがお力添えをおねがいします。 public class N

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

  • Java

    13467questions

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