RFR: 8298033: Character.codePointAt(char[], int, int) doesn't do JavaDoc-specified check
Roger Riggs
rriggs at openjdk.org
Fri Dec 2 15:48:06 UTC 2022
On Fri, 2 Dec 2022 12:44:18 GMT, Sergey Tsypanov <stsypanov at openjdk.org> wrote:
> I found out that this code
>
> public class Main {
> public static void main(String[] args) {
> String s = "Hello world!";
> char[] chars = s.toCharArray();
> int point = Character.codePointAt(chars, -1, 1);
> }
> }
>
> throws `ArrayIndexOutOfBoundsException` instead of JavaDoc-specified `IndexOutOfBoundsException`:
>
> Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 12
> at java.base/java.lang.Character.codePointAtImpl(Character.java:9254)
> at java.base/java.lang.Character.codePointAt(Character.java:9249)
> at org.example.Main.main(Main.java:7)
>
> and the method doesn't check whether `index` parameter is negative:
>
> public static int codePointAt(char[] a, int index, int limit) {
> if (index >= limit || limit < 0 || limit > a.length) {
> throw new IndexOutOfBoundsException();
> }
> return codePointAtImpl(a, index, limit);
> }
>
> I suggest to check the `index` parameter explicitly instead of relying on AIOOBE thrown from accessing the array with negative index.
It does meet the spec (subclasses of exception types are ok), but doesn't meet expectations of the implementation, especially since the implementation has an explicit test and throw.
As for the test, checking for exact exception type is fine.
JTreg tests frequently test the implementation, not just the spec.
-------------
PR: https://git.openjdk.org/jdk/pull/11480
More information about the core-libs-dev
mailing list