diff --git a/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java b/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java index d275b09834ab8..755fe1133f5da 100644 --- a/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java +++ b/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1856,6 +1856,14 @@ protected void computeTime() { if (isSet(ERA)) { era = internalGet(ERA); + // Don't check under, historically we have allowed values under + // BEFORE_MEIJI to be ignored during normalization + // We check against eras.length (not the highest constant ERA value) + // due to future added eras, or additional eras via + // "jdk.calendar.japanese.supplemental.era" + if (era >= eras.length) { + throw new IllegalArgumentException("Invalid era"); + } year = isSet(YEAR) ? internalGet(YEAR) : 1; } else { if (isSet(YEAR)) { diff --git a/test/jdk/java/util/Calendar/Builder/BuilderTest.java b/test/jdk/java/util/Calendar/Builder/BuilderTest.java index d74c38c067ac4..34fab9204ed52 100644 --- a/test/jdk/java/util/Calendar/Builder/BuilderTest.java +++ b/test/jdk/java/util/Calendar/Builder/BuilderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,8 +23,9 @@ /* * @test - * @bug 4745761 + * @bug 4745761 8350646 * @summary Unit test for Calendar.Builder. + * @run main BuilderTest */ import java.time.LocalDateTime; @@ -245,6 +246,11 @@ private static void testExceptions() { checkException(calb, IllegalArgumentException.class); calb = builder().setCalendarType("japanese").setWeekDate(2013, 1, MONDAY); checkException(calb, IllegalArgumentException.class); + // JDK-8350646 : Ensure IAE (instead of AIOOBE) for ERA over largest supported + calb = builder().setCalendarType("japanese").setFields(ERA, 6); + checkException(calb, IllegalArgumentException.class); + // Note that we don't check ERAs under BEFORE_MEIJI, i.e. -1, -2, ... as + // historically JapaneseImperialCalendar ignores such values when normalizing } private static Calendar.Builder builder() { diff --git a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java index 010519dc89e1f..411fc528dceef 100644 --- a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java +++ b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,6 +67,22 @@ public static void main(String[] args) { } private static void testProperty() { + // JDK-8350646: Ensure that IAE is thrown for out of range era, when + // additional era is defined + try { + new Calendar.Builder() + .setCalendarType("japanese") + .setFields(ERA, JapaneseEra.values().length + 2) + .build(); + System.err.println("Out of range era should have thrown IAE"); + errors++; + } catch (Exception e) { + if (!(e instanceof IllegalArgumentException)) { + System.err.printf("Out of range era threw \"%s\" instead of IAE\n", e); + errors++; + } + } + Calendar jcal = new Calendar.Builder() .setCalendarType("japanese") .setFields(ERA, 6, YEAR, 1, DAY_OF_YEAR, 1) diff --git a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java index 5383d0d124055..8eac4a97ef700 100644 --- a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java +++ b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8048123 8054214 8173423 + * @bug 8048123 8054214 8173423 8350646 * @summary Test for jdk.calendar.japanese.supplemental.era support * @library /test/lib * @build SupplementalJapaneseEraTest