[
https://issues.apache.org/jira/browse/LANG-1819?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18063305#comment-18063305
]
Partha Paul commented on LANG-1819:
-----------------------------------
I have made a PR with the updated doc:
[Fix {{ArrayUtils.removeAll()}} Javadoc for null array
input|https://github.com/apache/commons-lang/pull/1614]
> ArrayUtils.removeAll() Does Not Throw IndexOutOfBoundsException for Null
> Array Input
> ------------------------------------------------------------------------------------
>
> Key: LANG-1819
> URL: https://issues.apache.org/jira/browse/LANG-1819
> Project: Commons Lang
> Issue Type: Bug
> Components: lang.*
> Affects Versions: 3.20.0
> Environment: * Commons Lang version: (3.20.0 including the current
> snapshot version)
> * Java version: (javac 17.0.12)
> Reporter: Partha Paul
> Priority: Major
> Labels: docuentation, implementation
>
> The Javadoc for all ArrayUtils.removeAll() overloads states that
> {color:#172b4d}{_}passing a null array should throw an
> IndexOutOfBoundsException{_}.{color} However, the actual implementation
> silently returns null instead, which violates the documented contract.
> h2. Affected Method(s)
> All primitive and Object overloads of removeAll(), including but not limited
> to:
> * removeAll(boolean[] array, int... indices)
> * removeAll(byte[] array, int... indices)
> * removeAll(char[] array, int... indices)
> * removeAll(double[] array, int... indices)
> * removeAll(float[] array, int... indices)
> * removeAll(int[] array, int... indices)
> * removeAll(long[] array, int... indices)
> * removeAll(short[] array, int... indices)
> * removeAll(T[] array, int... indices)
> h2. Root Cause
> All typed overloads delegate to the generic removeAll(Object array, int...
> indices) overload via a cast:
> {code:java}
> return (boolean[]) removeAll((Object) array, indices);
> {code}
> When array is null, casting it to Object preserves the null, and the generic
> overload returns null silently instead of throwing IndexOutOfBoundsException.
> h2. Steps to Reproduce
> {code:java}
> @Test
> void testRemoveAllThrowsIndexOutOfBoundException() {
> assertThrows(IndexOutOfBoundsException.class, () ->
> ArrayUtils.removeAll((boolean[]) null, 2));
> }
> {code}
> h2. Expected Behavior
> Per the Javadoc:
> {quote}If the input array is null, an IndexOutOfBoundsException will be
> thrown, because in that case no valid index can be specified.
> {quote}
> An IndexOutOfBoundsException should be thrown.
> h2. Actual Behavior
> No exception is thrown. The method returns null.
> h2. Proposed Fix
> There are two valid approaches to resolving this inconsistency, and I am
> happy to submit a PR for whichever is preferred:
> h3. Option A - Fix the implementation
> Add an explicit null check in the generic removeAll(Object, int...) overload:
> {code:java}
> if (array == null) {
> throw new IndexOutOfBoundsException("Array is null, no valid index can be
> specified.");
> }
> {code}
> This aligns the implementation with the documented contract, since returning
> null for a null array input is arguably surprising and may be an unsafe
> behavior.
> h3. Option B - Update the documentation
> Update the Javadoc across all overloads to reflect the actual behavior:
> {code:java}
> * If the input array is {@code null}, {@code null} will be returned.
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)