原文はこちら。
This article was written by Nicolai Parlog (Java Developer Advocate at Oracle).
https://inside.java/2025/04/04/quality-heads-up/
OpenJDK Quality Groupは、リリースの全体的な品質向上の手段としてOpenJDKビルドを使ってのFOSSプロジェクトのテストを推進しています。
Quality Outreach
https://wiki.openjdk.java.net/display/quality/Quality+Outreach
このHeads upは、関係するプロジェクトに送られる定期的なコミュニケーションの一部です。
JDK 24 Release Candidate | JavaOne and More Heads-Up
https://mail.openjdk.org/pipermail/quality-discuss/2025-February/001141.html
このプログラムの詳細と参加方法については、上記wikiをご覧ください。
Null Enclosing Instance
Java言語仕様(The Java Language Specification、以後JLS)では、内部クラスコンストラクタのさまざまな使用箇所(use site)で、直近のenclosing instanceのnullチェックを含めるべきであると規定しています。また、それ以降は参照がnullではないと想定しています。
8.8.7.1. Explicit Constructor Invocations
https://docs.oracle.com/javase/specs/jls/se24/html/jls-8.html#jls-8.8.7.1
15.9.4. Run-Time Evaluation of Class Instance Creation Expressions
https://docs.oracle.com/javase/specs/jls/se24/html/jls-15.html#jls-15.9.4
しかし、これらのコンストラクタの宣言箇所では、そのようなチェックを義務付けていないため、コアリフレクション、メソッドハンドル、および直接的なバイトコード呼び出しでは、nullをenclosing instanceとして渡すことが可能なので、将来的にNullPointerExceptionが発生する可能性があります。
nullであるenclosing instanceはJLSの対象外であり、内部クラスの今後の進化によって予期せぬNullPointerExceptionが発生する可能性があるため、Java 25では、直近のenclosing instanceへの参照が常にnullではないことを保証するようになります。
Emitted Null Checks
JDK 25以後のjavacでは、リリース25以後をターゲットとする場合、内部クラスコンストラクタのenclosing instancesのnullチェックが実行されるようになります。
この動作の変更により、コアリフレクション、メソッドハンドル、または直接バイトコードを呼び出してenclosing instanceとしてnullを渡すコードで、新たなNullPointerExceptionが発生する可能性があります。このようなコードは稀であり、通常はライブラリやフレームワーク(アプリケーションとは対照的)で見られます。 このようなコードは、null参照を渡さないように変更する必要があります。
これらの追加のチェックが問題を引き起こす場合、
-XDnullCheckOuterThis=(true|false)
というフラグを使用すれば、エラーの発生を防止できます。 これは一時的な回避策と見なすべきであり、このフラグがいつまで利用可能であるかについては保証されません。
詳細は以下のBugをご覧ください。
[JDK-8351274] javac to null check immediately enclosing instance in inner class constructors
https://bugs.openjdk.org/browse/JDK-8351274