ADDITIONAL SYSTEM INFORMATION :
macOS version:
```java
Software:
System Software Overview:
System Version: macOS 13.2 (22D49)
Kernel Version: Darwin 22.3.0
Boot Volume: Macintosh HD
Boot Mode: Normal
Computer Name: MacBook Pro
User Name: MacBook
Secure Virtual Memory: Enabled
System Integrity Protection: Enabled
Time since boot: 1 day, 2 hours, 19 minutes
Hardware:
Hardware Overview:
Model Name: MacBook Pro
Model Identifier: MacBookPro18,1
Model Number: MK193CH/A
Chip: Apple M1 Pro
Total Number of Cores: 10 (8 performance and 2 efficiency)
Memory: 16 GB
System Firmware Version: 8419.80.7
OS Loader Version: 8419.80.7
Activation Lock Status: Disabled
```
OpenJDK version:
```jsx
openjdk version "21.0.7" 2025-04-15 LTS
OpenJDK Runtime Environment Temurin-21.0.7+6 (build 21.0.7+6-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.7+6 (build 21.0.7+6-LTS, mixed mode, sharing)
```
A DESCRIPTION OF THE PROBLEM :
### Description:
The provided test case triggers a `java.lang.NullPointerException` when executed on **OpenJDK 21**, while the same code does not exhibit this behavior on alternative JVM implementations, such as OpenJ9. Interestingly, the exception disappears if any other line in the test program is removed, suggesting that this issue may be related to JIT compiler optimizations.
```java
public class Test {
public static int[] arr = new int[500];
public static void main(String[] args) {
try {
int a = 7, b = 14;
for (int i = 16; i < 338; ++i) {
for (long l = 4; l < 78; ++l) {
Double.doubleToLongBits(checkSum(new double[400]));
java.util.List<java.lang.String> sequencedList = new java.util.ArrayList<>(java.util.List.of("A", "B", "C"));
sequencedList.addFirst("Z");
sequencedList.getLast().length();
}
try {
a = (a % Test.arr[i]);
} catch (ArithmeticException a_e) {
}
b = 123;
do {
} while (b-- > 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static double checkSum(double[] a) {
double sum = 0;
for (int j = 0; j < a.length; j++) {
sum += (a[j] / (j + 1) + a[j] % (j + 1));
}
return sum;
}
}
```
### Observed Behavior:
When executing the program using **OpenJDK 21**, the following exception is thrown:
```
java.lang.NullPointerException: Cannot invoke "String.length()" because the return value of "java.util.List.getLast()" is null
at Test.main(Test.java:12)
```
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Compile the `Test.java` file using `javac`.
2. Run the `Test` class using OpenJDK 21.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The program should execute normally and terminate without throwing any exceptions.
ACTUAL -
The program throws a NullPointerException due to an unexpected null return from List.getLast(), which should not occur under normal conditions.
---------- BEGIN SOURCE ----------
public class Test {
public static int[] arr = new int[500];
public static void main(String[] args) {
try {
int a = 7, b = 14;
for (int i = 16; i < 338; ++i) {
for (long l = 4; l < 78; ++l) {
Double.doubleToLongBits(checkSum(new double[400]));
java.util.List<java.lang.String> sequencedList = new java.util.ArrayList<>(java.util.List.of("A", "B", "C"));
sequencedList.addFirst("Z");
sequencedList.getLast().length();
}
try {
a = (a % Test.arr[i]);
} catch (ArithmeticException a_e) {
}
b = 123;
do {
} while (b-- > 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static double checkSum(double[] a) {
double sum = 0;
for (int j = 0; j < a.length; j++) {
sum += (a[j] / (j + 1) + a[j] % (j + 1));
}
return sum;
}
}
---------- END SOURCE ----------
macOS version:
```java
Software:
System Software Overview:
System Version: macOS 13.2 (22D49)
Kernel Version: Darwin 22.3.0
Boot Volume: Macintosh HD
Boot Mode: Normal
Computer Name: MacBook Pro
User Name: MacBook
Secure Virtual Memory: Enabled
System Integrity Protection: Enabled
Time since boot: 1 day, 2 hours, 19 minutes
Hardware:
Hardware Overview:
Model Name: MacBook Pro
Model Identifier: MacBookPro18,1
Model Number: MK193CH/A
Chip: Apple M1 Pro
Total Number of Cores: 10 (8 performance and 2 efficiency)
Memory: 16 GB
System Firmware Version: 8419.80.7
OS Loader Version: 8419.80.7
Activation Lock Status: Disabled
```
OpenJDK version:
```jsx
openjdk version "21.0.7" 2025-04-15 LTS
OpenJDK Runtime Environment Temurin-21.0.7+6 (build 21.0.7+6-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.7+6 (build 21.0.7+6-LTS, mixed mode, sharing)
```
A DESCRIPTION OF THE PROBLEM :
### Description:
The provided test case triggers a `java.lang.NullPointerException` when executed on **OpenJDK 21**, while the same code does not exhibit this behavior on alternative JVM implementations, such as OpenJ9. Interestingly, the exception disappears if any other line in the test program is removed, suggesting that this issue may be related to JIT compiler optimizations.
```java
public class Test {
public static int[] arr = new int[500];
public static void main(String[] args) {
try {
int a = 7, b = 14;
for (int i = 16; i < 338; ++i) {
for (long l = 4; l < 78; ++l) {
Double.doubleToLongBits(checkSum(new double[400]));
java.util.List<java.lang.String> sequencedList = new java.util.ArrayList<>(java.util.List.of("A", "B", "C"));
sequencedList.addFirst("Z");
sequencedList.getLast().length();
}
try {
a = (a % Test.arr[i]);
} catch (ArithmeticException a_e) {
}
b = 123;
do {
} while (b-- > 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static double checkSum(double[] a) {
double sum = 0;
for (int j = 0; j < a.length; j++) {
sum += (a[j] / (j + 1) + a[j] % (j + 1));
}
return sum;
}
}
```
### Observed Behavior:
When executing the program using **OpenJDK 21**, the following exception is thrown:
```
java.lang.NullPointerException: Cannot invoke "String.length()" because the return value of "java.util.List.getLast()" is null
at Test.main(Test.java:12)
```
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Compile the `Test.java` file using `javac`.
2. Run the `Test` class using OpenJDK 21.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The program should execute normally and terminate without throwing any exceptions.
ACTUAL -
The program throws a NullPointerException due to an unexpected null return from List.getLast(), which should not occur under normal conditions.
---------- BEGIN SOURCE ----------
public class Test {
public static int[] arr = new int[500];
public static void main(String[] args) {
try {
int a = 7, b = 14;
for (int i = 16; i < 338; ++i) {
for (long l = 4; l < 78; ++l) {
Double.doubleToLongBits(checkSum(new double[400]));
java.util.List<java.lang.String> sequencedList = new java.util.ArrayList<>(java.util.List.of("A", "B", "C"));
sequencedList.addFirst("Z");
sequencedList.getLast().length();
}
try {
a = (a % Test.arr[i]);
} catch (ArithmeticException a_e) {
}
b = 123;
do {
} while (b-- > 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static double checkSum(double[] a) {
double sum = 0;
for (int j = 0; j < a.length; j++) {
sum += (a[j] / (j + 1) + a[j] % (j + 1));
}
return sum;
}
}
---------- END SOURCE ----------
- caused by
-
JDK-8297933 [REDO] Compiler should only use verified interface types for optimization
-
- Resolved
-