アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のコードについてですが、変数sはnullで初期化されてません。
ですが、コンパイルエラーが発生することもなく実行可能です。
どうしてなのでしょうか?
よろしくお願い致します。


package exercise;
import lib.Input;
public class P2 {
public static void main(String[] args) {
String s ;
while((s=Input.getString())!= null){
System.out.println(s);
}
}
}



【設定環境】
java: 1.8.0_66
Eclipse 4.5 Mars マース SR1 for Windows ベース
Pleiades All in One 4.5.1.v20151002 Java 64bit Standard Edition

【取得した資格】
サーティファイ Javaプログラミング能力検定試験 3級
オラクルJavaアソシエイツ
オラクルJavaプログラマ SE7 Silver

質問者からの補足コメント

  • うーん・・・

    String s ;    ←変数の宣言
    s=Input.getString()  ←変数の初期化

    System.out.println(s);

    printlnの引数sは、直近のwhileブロックの内側から、
    mainメソッド内で宣言・初期化されたローカル変数sにアクセスしていると、
    いうことでしょうか?


    1行目 public static void main(String[] args)
    2行目 {
    3行目 String s ;  
    4行目 while((s=Input.getString())!= null)
    5行目 {
    6行目 System.out.println(s);
    7行目 }
    8行目 }

    ローカル変数sのスコープは2~8行目までの間でしょうか?

      補足日時:2015/11/16 20:28
  • Javaの文法が少し混乱しています。
    (>'A`)> ゥォォォオオオオオオ

      補足日時:2015/11/16 20:29

A 回答 (5件)

Javaの言語仕様は以下の通り



局所変数には,使用前に,初期化又は代入によって,
明確な代入の規則を使ってコンパイラが検証できる方法で,
値を明示的に与えなければならない。

要するに println で sを参照する前に、
sに代入が行なわれていれば 問題ないということです。
初期化は必須ではありません。
    • good
    • 0
この回答へのお礼

tknakamuri様
返信ありがとうございます。
私は無駄に複雑に考え過ぎていました。
今後はオラクルのホームページにも目を通して、
技術力を向上させて行きます。

お礼日時:2015/11/23 18:17

>String型の場合はデフォルト値がnullです。



間違い。
局所変数は既定値を持ちません。
    • good
    • 0
この回答へのお礼

tknakamuri様
補足の説明、ありがとうございます。

お礼日時:2015/11/23 18:18

変数定義のみで初期化しない場合、各型ごとに定められたデフォルト値が設定されます。

String型の場合はデフォルト値がnullです。よって、「String s;」でsにはnullが設定されています。
変数sのスコープはmainメソッド内です。while文内もスコープ範囲内です。
    • good
    • 0
この回答へのお礼

juniku1様
返信ありがとうございます。

お礼日時:2015/11/23 18:18

「初期化していない変数」があっても, それだけで直ちにコンパイルエラーになるわけではありません.



どうであればよいかは言語仕様に書いてあります.
    • good
    • 0
この回答へのお礼

Tacosan様
返信ありがとうございます。

お礼日時:2015/11/23 18:17

・サーティファイ Javaプログラミング能力検定試験 3級


 http://www.sikaku.gr.jp/js/jv/org/about/sample/ よりたどれる3級の試験サンプルに同様の中括弧内から外の変数にアクセスしている問題があるのを確認
・オラクルJavaアソシエイツ、オラクルJavaプログラマ SE7 Silver
 オラクルの Java 資格のページで資格レベルが同一であることを確認後、アソシエイツの試験範囲に変数のスコープが含まれているのを確認
……うーん、保有している資格の試験範囲にはどれも変数スコープについて含まれているようだから、この辺をちゃんと勉強していたなら何の疑問も持たないはずなんだけどなぁ……

> printlnの引数sは、直近のwhileブロックの内側から、
> mainメソッド内で宣言・初期化されたローカル変数sにアクセスしていると、
> いうことでしょうか?
その通り。

> ローカル変数sのスコープは2~8行目までの間でしょうか?
違う。変数が宣言された3行目から、宣言された時点での中括弧のネストの一番内側から抜ける8行目まで。

あと、
> s=Input.getString()  ←変数の初期化
は初期化ではなく単なる代入です。変数の初期化は変数の宣言時にしか行えません。
    • good
    • 0
この回答へのお礼

hitomura様

返信ありがとうございます。
資格を習得していながら、
初歩的な内容があやふやなままでした。
今また参考書で勉強をし直しています。

お礼日時:2015/11/23 18:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!