きしだのはてな このページをアンテナに追加 RSSフィード

2018-06-18(月) Java9から三項演算子でのunboxingの挙動がJava8とは変わっている

[]Java9から三項演算子でのunboxingの挙動がJava8とは変わっている 20:51 Java9から三項演算子でのunboxingの挙動がJava8とは変わっているを含むブックマーク Add Star

Java9からJDK11-ea18まで、三項演算子でのunboxingの挙動がJava8とは変わっているようです。


次のようなコードの挙動がJava8でコンパイルしたときとJava9以降でコンパイルしたときとで変わっています。

Double d = false ? 1.0 : new HashMap<String, Double>().get("a");

試しに次のようなコードを実行してみます。

import java.util.HashMap;

public class BoxingBehavior {
    public static void main(String[] args) {
        System.out.println(System.getProperty("java.version"));
        Double d = false ? 1.0 : new HashMap<String, Double>().get("a");
        System.out.println(d);
    }
}

Java8ではdにnullが入ります

1.8.0_151
null

Java9以降ではNullPointerExceptionが発生します。

Exception in thread "main" 9.0.4
java.lang.NullPointerException
	at com.mycompany.BoxingBehavior.main(BoxingBehavior.java:17)

Java9以降のコンパイラでtargetを1.8にしても発生します。また、コンパイラのバグなので、Java9以降でtargetを1.8にしてコンパイルしたバイナリをJava8で動かしても発生します。


これ、Java6のときから何度か発生しているようなのに、また発生したということは、この時点でテストをちゃんと作らなかったのが問題じゃないですかね。

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6977221

https://bugs.openjdk.java.net/browse/JDK-8062801


※追記 こちらの挙動のほうが正しいっぽいので、バグじゃないらしく、Java8までがバグだったぽい

トラックバック - http://d.hatena.ne.jp/nowokay/20180618