RFR: 8164714: Constructor.newInstance creates instance of inner class with null outer class [v5]

Chen Liang liach at openjdk.org
Fri Mar 21 20:45:26 UTC 2025


> The Java Language Specification anticipates that inner classes always have non-null enclosing instances. It ensures the non-nullness by enforcing null checks at the use sites that provides immediately enclosing instances to inner class constructors, such as for super invocations, or an `outer.new Inner()` invocation.
> 
> However, the translations do not require a null check in the actual constructor, when the immediately enclosing instance is received through a mandated parameter and stored into a synthetic field or discarded.  As a result, class file constructs, such as core reflection, method handles, or arbitrary class files can pass in `null` for the immediately enclosing instance, and later execution may fail with NPE by chance if any enclosing instance is used.
> 
> This patch proposes to add a null check against the "outer this" in inner class constructors that call a superclass constructor, including when the "outer this" is discarded immediately thereafter (#4966) for consistency. This null check will be emitted regardless of source or target versions. This change is considered an implementation artifact like the synthetic field that captures the enclosing instance; as a result, there is no JLS change.
> 
> The reason for this eager NPE decision is that there is no compatibility of such NPE behaviors - any evolution of the inner classes constructed with null enclosing instances may suddenly start using an enclosing instance and fail with NPE. Therefore, there's no compatibility aspect in such out-of-spec usages of passing `null` as immediately enclosing instance, and this null check can be considered such an evolution.

Chen Liang has updated the pull request incrementally with one additional commit since the last revision:

  Reduce code repetition

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/23875/files
  - new: https://git.openjdk.org/jdk/pull/23875/files/6729faad..d2e10cda

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=23875&range=04
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=23875&range=03-04

  Stats: 13 lines in 1 file changed: 4 ins; 7 del; 2 mod
  Patch: https://git.openjdk.org/jdk/pull/23875.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/23875/head:pull/23875

PR: https://git.openjdk.org/jdk/pull/23875


More information about the compiler-dev mailing list