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

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

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

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

Q&A

解決済

3回答

1430閲覧

java 初期化のエラー

rikuanpg9294

総合スコア15

Java

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

0グッド

0クリップ

投稿2021/08/09 01:21

java

1import java.io.*; 2 3public class Switch{ 4 public static void name(String[] args) { 5 int c; 6 System.out.println("文字を入力してください"); 7 8 try{ 9 c = System.in.read(); 10 }catch(Exception e){ 11 12 } 13 14 switch(c) { 15 case 65: 16 17 System.out.println("押されたキーは[a]です。"); 18 break; 19 20 case 66: 21 System.out.println("押されたキーは[b]です。"); 22 break; 23 24 case 67: 25 System.out.println("押されたキーは[c]です。"); 26 break; 27 28 case 68: 29 System.out.println("押されたキーは[d]です。"); 30 break; 31 32 case 69: 33 System.out.println("押されたキーは[e]です。"); 34 break; 35 default: 36 System.out.println("押されたキーは[以外]です。"); 37 } 38 } 39}

Switch文の勉強をしている際に以下のようなエラーが出ました。

Switch.java:14: エラー: 変数cは初期化されていない可能性があります
switch (c) {
^
エラー1個

4行目に int cと記述しているので何故エラーが出たかわかりません。初歩的な質問ですがご教授お願いいたします。

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

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

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

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

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

hentaiman

2021/08/09 01:53

初歩的な質問はgoogle検索した方がサンプルコードや説明がたくさん見つかって良いです エラーメッセージをそのままグーグルに貼り付けてみましょう 固有名詞がある場合はそれを取り除いて検索してみましょう
guest

回答3

0

ベストアンサー

int c

これは宣言であって初期化ではないです。
cという変数はint型だと言うだけで、何も値を保持していません。
「初期化」とは変数などに初期値を設定することを指します。
Exceptionに入ればそれこそ何の値も設定されないことになります。
Exceptionに入るかどうかは実行してみないと分からないので「初期化されない可能性がある」と警告が出ます。
例え実装者が「必ず正当な値が入るつもり」で実装していたとしても、プログラム側はそんな意図は知らないわけで、与えられた情報にそって処理が行われます。
try-catchを入れないとそもそもコンパイルできないことだってあるのは、その機能が何かしらのExceptionをthrowするようにできているからで、それはつまり、Exceptionが起きる可能性がある機能であることを指します。
なので、変数を必ず参照する実装なのであれば、初期化は必須です。
※Exception起きた状態で続行するかどうかは要件次第

投稿2021/08/09 01:39

編集2021/08/09 01:44
m.ts10806

総合スコア80875

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

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

0

勉強させていただきました。

プリミティブのintの宣言なのだから、初期値は0じゃないの?って思って、
なぜエラーになるんだろうな。。。って疑問に思い調べてみたんですが、

Javaのルールとして、ローカル変数はすべて明示的に値を定義してあげないとダメ見たいです。
なぜintの初期値がoと勘違いしていたのかというと、

Java

1public class Switch{ 2 3 static int c; 4 5 public static void name(String[] args) {

メンバ変数で定義したときに、クラスがロードされる(オブジェクトであれば、クラスがインスタンス生成される)タイミングでメンバ変数が暗黙の定義で初期化される、というのを、すべての宣言の初期化と勘違いしていたようです。

ありがとうございます。一つ賢くなりました。

投稿2021/08/09 05:15

TetsujiMiwa

総合スコア1124

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

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

0

デバッグしましょう
プログラミングは書いて終わりではありません。デバッグやテストまで含みます。

今回の場合、大抵は『初期化や代入をせずに使っていること』が原因です。

それとコードを読みましょう

コードを読むコツは『一行レベルで、この行が何をしているか考えながら読む』です。
例えばコメントとして書くとか。

そうすると、int c は初期化されておらず、System.in.readメソッドで取得していますが、仮にこのメソッドが例外を投げたらcには何も入りません。

一応Javaとかの言語では型ごとに0とかの初期値が設定されているようですが、非推奨(と思われる)。

(そう言えばJavaはローカルかフィールドかとかで初期化される/されないがあったんだった…)

C言語とかでは初期値を設定しない場合は『不定値』が入ります。
環境によっては0以外(1213とかのような出鱈目な値)になります。

その名残でしょうね。

なので、このロジックでやるならtryの中(System.in.readメソッドがあるような場所)に書くか、int c を初期化するかですね。

まずは『エラーメッセージを読みましょう』。

エラーメッセージにヒントが隠されています。

投稿2021/08/09 01:37

編集2021/08/09 02:14
BeatStar

総合スコア4962

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

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

maisumakun

2021/08/09 01:55 編集

> 一応Javaとかの言語では型ごとに0とかの初期値が設定されているようですが、非推奨(と思われる)。 ローカル変数の場合は未初期化の可能性があるまま参照しようとすると、今回の質問のようにコンパイルエラーとなります。フィールドの場合は0あるいはnullで初期化されます。
hentaiman

2021/08/09 01:50

コンパイル可否に関わらずやる事はデバッグです
BeatStar

2021/08/09 02:06

@ m.ts10806さん > デバッグ関係ないのでは? すみません。説明が紛らわしかったですね。私が書いたものの意味は広義的な方で、『エラーメッセージを読んで対処する』です。 紛らわしいので修正します。
BeatStar

2021/08/09 02:09

@ maisumakunさん > ローカル変数の場合は未初期化の可能性があるまま参照しようとすると... あー、確かにそうですね... 修正します。
Zuishin

2021/08/09 03:43

本来デバッグは「バグを取り除くこと」で、「(デバッガを使うなどして)バグを発見すること」の方が広義の気がするんですよね。 コンパイルできないならそこにバグがあるので、デバッガを使う前にまずそれをデバッグする必要があると思います。 今回の問題点は例外を握りつぶしていることですね。 ここで正しい処理をしていればコンパイルエラーにはならず、デバッガの出番もあったかもしれません。 デバッガを使って欲しいのであれば「デバッグしましょう」ではなく「ここにブレークポイントを張ってステップ実行しながらこの変数の値を確かめましょう」のように、より具体的な指示を出した方が伝わりやすいと思いますが、それでも teratail の平均的な質問者にとってハードルはかなり高いと思われます。 ブレークポイントの張り方や使い方について各環境に合わせてそれぞれ詳細な説明を準備するのも手間ですし、現実的には質問者にブレークポイントが伝わるかどうかを確かめた上で printf デバッグなども視野に入れていかなければいけないでしょう。 伝わらなくていいなら話は別ですが、これだけ「デバッグしましょう」という回答を繰り返しているところを見ると、どうしても伝えたいんですよね?
BeatStar

2021/08/09 06:03

@ Zuishinさん > 「(デバッガを使うなどして)バグを発見すること」の方が広義の気がするんですよね。 あ、そうなんですか… > それでも teratail の平均的な質問者にとってハードルはかなり高いと思われます たしかにそうかもしれません… > 伝わらなくていいなら話は別ですが、これ... そうですね。できれば伝えたいです。 (ただ私が説明下手なので…)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問