{"record":{"id":"830af27fbd0e87cd","repo":"TheAlgorithms/Java","slug":"invalid-range-indices-830af2","errorCode":null,"errorMessage":"Invalid range indices","messagePattern":"Invalid range indices","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/com/thealgorithms/prefixsum/RangeSumQuery.java","lineNumber":69,"sourceCode":"        return prefixSum;\n    }\n\n    /**\n     * Returns the sum of elements from index left to right (inclusive)\n     * using the provided prefix sum array.\n     *\n     * @param prefixSum The prefix sum array computed using buildPrefixSum.\n     * @param left      The start index (inclusive).\n     * @param right     The end index (inclusive).\n     * @return The sum of elements in the range [left, right].\n     * @throws IllegalArgumentException if indices are invalid.\n     */\n    public static int sumRange(int[] prefixSum, int left, int right) {\n        if (prefixSum == null) {\n            throw new IllegalArgumentException(\"Prefix sum array cannot be null\");\n        }\n        if (left < 0 || right >= prefixSum.length - 1 || left > right) {\n            throw new IllegalArgumentException(\"Invalid range indices\");\n        }\n        return prefixSum[right + 1] - prefixSum[left];\n    }\n}\n","sourceCodeStart":51,"sourceCodeEnd":74,"githubUrl":"https://github.com/TheAlgorithms/Java/blob/fdfb9a395b310167a66bd29e311e36e0e3e9b964/src/main/java/com/thealgorithms/prefixsum/RangeSumQuery.java#L51-L74","documentation":"Thrown by RangeSumQuery.sumRange(prefixSum, left, right) when the range is invalid: left < 0, right >= prefixSum.length - 1, or left > right. Note this throws IllegalArgumentException (not IndexOutOfBoundsException like PrefixSum.sumRange does) — an inconsistency between the two classes. Bounds are inclusive and measured against the ORIGINAL array length (prefixSum.length - 1).","triggerScenarios":"Call sumRange(ps, 0, ps.length - 1) treating the prefix array's own length as the data length; sumRange(ps, -1, 2); sumRange(ps, 5, 2).","commonSituations":"Confusing the prefix-sum array length (n+1) with the data length (n); passing an exclusive end as inclusive; 1-based indices not converted.","solutions":["Remember prefixSum has length n+1: valid right is at most prefixSum.length - 2 for a data array of size n.","Track the ORIGINAL data length separately and validate right < dataLength.","Use the PrefixSum class instead, which encapsulates the length and avoids this confusion."],"exampleFix":"// before\nint s = RangeSumQuery.sumRange(ps, left, right); // right miscomputed against ps.length\n\n// after\nint s = RangeSumQuery.sumRange(ps, left, Math.min(right, ps.length - 2)); // data length = ps.length - 1","handlingStrategy":"validation","validationCode":"int dataLen = prefixSum.length - 1; // prefix array is n+1\nif (left < 0 || right >= dataLen || left > right) {\n    throw new IllegalArgumentException(\"range invalid for data length \" + dataLen);\n}\nint s = RangeSumQuery.sumRange(prefixSum, left, right);","typeGuard":"static boolean validStaticRange(int left, int rightInclusive, int prefixArrayLength) {\n    int dataLen = prefixArrayLength - 1;\n    return left >= 0 && rightInclusive < dataLen && left <= rightInclusive;\n}","tryCatchPattern":"try {\n    int s = RangeSumQuery.sumRange(prefixSum, left, right);\n} catch (IllegalArgumentException e) {\n    logger.warn(\"Bad static range query\");\n}","preventionTips":["Remember prefixSum.length == dataLen + 1; never use it directly as the data length.","Track the original data length alongside the prefix array.","Consider the stateful PrefixSum class to avoid this off-by-one footgun."],"tags":["prefix-sum","input-validation","illegal-argument","off-by-one","api-inconsistency"],"backgroundTag":null,"analyzedSha":"fdfb9a395b310167a66bd29e311e36e0e3e9b964","analyzedAt":"2026-08-13T23:36:13.315Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}