読者です 読者をやめる 読者になる 読者になる

へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)!

Javaで、初期化されてないメンバ変数をなんでローカルで代入したらコンパイルエラーになるか実験してみた

PC Java

まずはコンパイルエラーになるやつ

public class local_value{

    public static void main(String args){

        int x = 0;

        String str;

        if(x < 1){

            str = "test";

        }

        int len;

        System.out.println(len = str.length()); // { strって何も参照してないじゃん!(げきおこ)

    }

 

}

知っての通り、 ↑ はコンパイルエラーになる。

public class local_value2 {

    public static void main(String args){

        String str;

        if(0 < 1){ // { 常にtrueだからこの部分は絶対通るよ

            str = "test";

        }

        int len;

        System.out.println(len = str.length()); // { strは"test"を参照しているんだね!

    }

じゃあこっちは? local_value2はコンパイルエラーにならない。出力は4。

 public class local_value3{

    public static void main(String args){

        int x = 0;

        String str;

        if(x < 1){

            str = "test";

        }

        int len;

        //削除 { strを呼び出さないから上の行が変でもコンパイルは通るよ!

    }

}

local_value3もコンパイルエラーにならない。

public class local_value4{

    public static void main(String args){

        int x = 0;

        String str = null;

        if(x < 1){

            str = "test";

        }

        int len;

        System.out.println(len = str.length()); // { nullだったstrは"test"を参照しているね!

    }

}

local_value4もコンパイルエラーにならない。出力は4。

public class local_value5{

    public static void main(String[] args){

        int x = 0;

        String str = "";

        if(x < 1){

            str = "test";

        }

        int len;

        System.out.println(len = str.length()); // { ""だったstrは"test"を参照しているね!

    }

}

local_value5もコンパイルエラーにならない。出力は4。

謎。

 

 

追記:

謎じゃなかった

ぬるぽの発生しそうな原因もついでにわかって良かった