Java9から三項演算子でのunboxingの挙動がJava8とは変わっている

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までがバグだったぽい
※追記(6/19) Java言語仕様15.25 条件演算子の表15.25-D
Chapter 15. Expressions