2018-06-18(月) Java9から三項演算子でのunboxingの挙動がJava8とは変わっている
■[java]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までがバグだったぽい