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

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

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

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

Q&A

解決済

3回答

2040閲覧

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

gomakasu423

総合スコア31

Java

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

0グッド

0クリップ

投稿2018/05/10 12:39

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

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

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

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

java

1package Pass; 2import lib.Input; 3public class Pass10_03_1 { 4 public static void main(String[] args) { 5 int m; 6 String s=""; 7 while ((m=Input.getInt())!=0){ 8 if(m==12||m==1||m==2){ 9 s="冬"; 10 }else if(m==3||m==4||m==5){ 11 s="春"; 12 }else if(m==6||m==7||m==8){ 13 s="夏"; 14 }else if(m==9||m==10||m==11){ 15 s="秋"; 16 }else{ 17 s="?"; 18 } 19 System.out.println(s); 20 } 21 } 22} 23変数宣言でString s="";と書いてありますが、 24始めはString S;と書きました。 25しかし、最後にSystem.out.println(s)としたところ、初期化されてなく文法エラーとなりました。 26 27そこでString s="";としたらイメージ通りに表示されたのですが、 28なんとなく腑に落ちない感じがします。 29数字ならば始めの値が重要だと思いますが文字列だからいいような気がいたします。 30もしかしたら、変な覚え方してますでしょうか。 31ぜひともご教授よろしくお願いいたします。 32

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

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

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

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

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

guest

回答3

0

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

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

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

投稿2018/05/10 13:01

maisumakun

総合スコア145183

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

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

gomakasu423

2018/05/10 13:05

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

0

ベストアンサー

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

Java

1package Pass; 2import lib.Input; 3 4public class Pass10_03_1 { 5 public static void main(String[] args) { 6 int m; 7 String s; // 初期化しないで、 8 while ((m=Input.getInt())!=0){ 910 // System.out.println(s); こっちじゃなくて 11 } 12 System.out.println(s); // こっちに書いたのでは? 13 } 14}

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


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

投稿2018/05/10 12:52

LouiS0616

総合スコア35660

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

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

maisumakun

2018/05/10 13:02

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

2018/05/10 13:03

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

0

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

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

java

1public class Pass10_03_1 { 2 public static void main(String[] args) { 3 String seasons[] = { 4 "冬", "冬", "春", 5 "春", "春", "夏", 6 "夏", "夏", "秋", 7 "秋", "秋", "冬" 8 }; 9 10 // while ((m = Input.getInt()) != 0) { 11 for (int i = 0; i <= 13; i++) { 12 String s; 13 if ( 1 <= i && i <= seasons.length ) { 14 s = seasons[i - 1]; 15 } else { 16 s = "?"; 17 } 18 System.out.print(s); 19 } 20 System.out.println(); 21 } 22}

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

投稿2018/05/10 13:43

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問