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

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

ただいまの
回答率

90.34%

  • Java

    14423questions

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

elseをelse if にしたらコンパイルエラーになってしまいました。(Java問題集:paiza ioで実行)

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,004

bonobiya

score 9

Javaの問題集で 
「2つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の全整数を小さい方から順に表示するプログラムを作成せよ」
(たとえば整数値Aに10、整数値Bに14を入力したら
10 11 12 13 14
という表示がされるプログラムを作成せよ)
という問題をやっていて、作成したプログラムを実行しようとしたのですが、コンパイルエラーになっていましました。

模範解答を見て模範解答どおりに修正したら、エラーにならずにコンパイルできたのですが、私が書いたコードだとエラーになって模範解答のコードだとエラーにならない理由が理解できませんでした。

私が書いたコードと模範解答のコードを記載するので、どなたかご解説いただけないでしょうか?

私が書いたコード

import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);


        int a = stdIn.nextInt();
        System.out.println("整数A : "+a);

        int b = stdIn.nextInt();
        System.out.println("整数B : "+b);


        int start, end;
        if(a < b) {
            start = a;
            end = b;
        } else if(a > b){
            start = b;
            end = a;
        }
        int i = start;
        do {
            System.out.print(i++);
            System.out.print(" ");

        } while(i < end);
        System.out.print(i);
        System.out.println();
    }
}

模範解答

import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);


        int a = stdIn.nextInt();
        System.out.println("整数A : "+a);

        int b = stdIn.nextInt();
        System.out.println("整数B : "+b);


        int start, end;
        if(a < b) {
            start = a;
            end = b;
        } else{
            start = b;
            end = a;
        }
        int i = start;
        do {
            System.out.print(i++);
            System.out.print(" ");

        } while(i < end);
        System.out.print(i);
        System.out.println();
    }
}

読み込んだ整数A Bのどちらが大きいかの条件分岐の箇所でelseかelse ifかの違いでコンパイルエラーになってしまいました。
エラーメッセージは以下の通りです。

Main.java:23: error: variable start might not have been initialized
        int i = start;
                ^
Main.java:28: error: variable end might not have been initialized
        } while(i < end);
                    ^
2 errors
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+5

if-elseだとstart,endが確実に初期化されますが(そうコンパイラが判断する)
if-elseifだとそうなりません。(全部の条件を満たさなかったらstart,endが初期化されない)

というわけで、あなたのコードは might not have been initializedと言われています。

なお、条件が網羅的かどうかは見てないようなので、
if(a<b){...}
else if(a>=b){...}
に置き換えてもエラーになります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/05 13:29

    回答ありがとうございました。

    キャンセル

+2

Javaでは、ローカル変数は使用する段階で確実な代入状態であることが求められます。
つまり、あるローカル変数が使われる段階では、その変数に確実に何かしらの値が代入されている必要があります。

if文の前で宣言されたstart,endは宣言されただけで、代入されていません。このままでは「確実な代入状態」にはなりません。その代入の方法として、if文で条件分岐して代入を行うわけですが…

        if(a < b) {
            start = a;
            end = b;
        } else if(a > b){
            start = b;
            end = a;
        }


あなたのこのコードでは、どのif文にも引っ掛からなかった場合、初期化が行われないままこの先に進んでしまうため、確実な代入ができない状態になっています。模範解答のコードの場合、

        if(a < b) {
            start = a;
            end = b;
        } else{
            start = b;
            end = a;
        }


ifかelseのいずれかには確実に入ることができ、いずれに入っても初期化が行われるので、確実な代入が可能になっています。

もし仮にコードが

        if(a < b) {
            start = a;
            end = b;
        } else if(a >= b){
            start = b;
            end = a;
        }


となっていて、理論的には確実にどちらかを通る状態だとしても、コンパイラは条件の中身までは見ていないので、これも「いずれも通らない可能性がある」とみなされ、確実な代入状態となりません。

ちなみに私ならこう書きたいですね。

start = Math.min(a, b);
end = Math.max(a, b);

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/05 13:29

    回答ありがとうございました。

    キャンセル

-4

ifの入れ子の間違いです。

        } else if(a > b){
            start = b;
            end = a;
        }


の部分が

        } else    if(a > b){
                      start = b;
                      end = a;
                  }
        }


として、}を入れておかなければ、else { の範囲が下まで延びていってしまいます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/05 13:18

    if ~ else if ~ else構文というものがありますが。
    それに、これだとelse以降の括弧の対応が崩れてしまっていますよね(「入れ子である」とするならば、elseの{が無い状態です)。

    キャンセル

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

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

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

  • Java

    14423questions

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