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

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

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

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

Q&A

解決済

3回答

8474閲覧

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

bonobiya

総合スコア15

Java

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

0グッド

0クリップ

投稿2017/03/04 11:48

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

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

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

私が書いたコード

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args){ 5 Scanner stdIn = new Scanner(System.in); 6 7 8 int a = stdIn.nextInt(); 9 System.out.println("整数A : "+a); 10 11 int b = stdIn.nextInt(); 12 System.out.println("整数B : "+b); 13 14 15 int start, end; 16 if(a < b) { 17 start = a; 18 end = b; 19 } else if(a > b){ 20 start = b; 21 end = a; 22 } 23 int i = start; 24 do { 25 System.out.print(i++); 26 System.out.print(" "); 27 28 } while(i < end); 29 System.out.print(i); 30 System.out.println(); 31 } 32}

模範解答

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args){ 5 Scanner stdIn = new Scanner(System.in); 6 7 8 int a = stdIn.nextInt(); 9 System.out.println("整数A : "+a); 10 11 int b = stdIn.nextInt(); 12 System.out.println("整数B : "+b); 13 14 15 int start, end; 16 if(a < b) { 17 start = a; 18 end = b; 19 } else{ 20 start = b; 21 end = a; 22 } 23 int i = start; 24 do { 25 System.out.print(i++); 26 System.out.print(" "); 27 28 } while(i < end); 29 System.out.print(i); 30 System.out.println(); 31 } 32}

読み込んだ整数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

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

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

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

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

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

guest

回答3

0

ベストアンサー

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

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

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

投稿2017/03/04 11:58

編集2017/03/04 12:03
ozwk

総合スコア13521

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

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

bonobiya

2017/03/05 04:29

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

0

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

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

java

1 if(a < b) { 2 start = a; 3 end = b; 4 } else if(a > b){ 5 start = b; 6 end = a; 7 }

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

java

1 if(a < b) { 2 start = a; 3 end = b; 4 } else{ 5 start = b; 6 end = a; 7 }

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

もし仮にコードが

java

1 if(a < b) { 2 start = a; 3 end = b; 4 } else if(a >= b){ 5 start = b; 6 end = a; 7 }

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

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

java

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

投稿2017/03/04 17:00

編集2017/03/05 03:11
swordone

総合スコア20651

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

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

bonobiya

2017/03/05 04:29

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

0

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

Java

1 } else if(a > b){ 2 start = b; 3 end = a; 4 } 5

の部分が

Java

1 } else if(a > b){ 2 start = b; 3 end = a; 4 } 5 } 6

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

投稿2017/03/04 11:55

seastar3

総合スコア2285

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

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

archiver

2017/03/05 04:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問