{"record":{"id":"308e709a0d3d39e0","repo":"JetBrains/intellij-community","slug":"row-d-access-failed-hierarchicalidx-cannot-be-em","errorCode":null,"errorMessage":"Row %d access failed: hierarchicalIdx cannot be empty","messagePattern":"Row (.+?) access failed: hierarchicalIdx cannot be empty","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"grid/core-impl/src/datagrid/HierarchicalColumnsDataGridModel.java","lineNumber":410,"sourceCode":"\n    return CsvImportUtil.getPreferredTypeMergerBasedOnContent(\n      values, STRING_MERGER, INTEGER_MERGER, BIG_INTEGER_MERGER, DOUBLE_MERGER, BOOLEAN_MERGER);\n  }\n\n  private static Object getValue(GridRow row, int[] hierarchicalIdx) {\n    validateHierarchicalIndex(hierarchicalIdx, row.getRowNum());\n    return tryExtractValueByHierarchicalIndex(GridRow.getValues(row), hierarchicalIdx, row.getRowNum());\n  }\n\n  private static void validateHierarchicalIndex(int[] hierarchicalIdx, int rowNum) {\n    if (hierarchicalIdx == null) {\n      throw new IllegalArgumentException(\n        String.format(\"Row %d failed: hierarchicalIdx cannot be null\", rowNum)\n      );\n    }\n\n    if (hierarchicalIdx.length == 0) {\n      throw new IllegalArgumentException(\n        String.format(\"Row %d access failed: hierarchicalIdx cannot be empty\", rowNum)\n      );\n    }\n  }\n\n  private static @Nullable Object tryExtractValueByHierarchicalIndex(Object[] topLevelValues, int[] hierarchicalIdx, int rowNum) {\n    try {\n      return extractValueByHierarchicalIndex(topLevelValues, hierarchicalIdx);\n    } catch (IndexOutOfBoundsException | NullPointerException | IllegalArgumentException e) {\n      throw new RuntimeException(String.format(\"Row %d access failed: %s\", rowNum, e.getMessage()), e);\n    }\n  }\n\n  public static Object extractValueByHierarchicalIndex(Object[] topLevelValues, int[] hierarchicalIdx) {\n    Object result = null;\n    Object[] data = topLevelValues;\n    for (int i = 0; i < hierarchicalIdx.length; ++i) {\n      int idx = hierarchicalIdx[i];","sourceCodeStart":392,"sourceCodeEnd":428,"githubUrl":"https://github.com/JetBrains/intellij-community/blob/be881553f2a76ac8b4ea53950d93f0de78295c19/grid/core-impl/src/datagrid/HierarchicalColumnsDataGridModel.java#L392-L428","documentation":"HierarchicalColumnsDataGridModel.validateHierarchicalIndex throws IllegalArgumentException when the hierarchical index array is non-null but empty (length == 0). An empty path addresses no column level, so traversal cannot even start; the message identifies the offending row number.","triggerScenarios":"Calling hierarchical value access with new int[0] — e.g. a column whose hierarchy path was never populated (root-only column) or a list-of-levels that was filtered to empty.","commonSituations":"Columns built programmatically without a hierarchy path; data-driven column definitions where the path list is empty for top-level columns and code converts it to an array unconditionally.","solutions":["Ensure every column has at least one level in its hierarchical path (top-level columns get a single-element array like [colIdx]).","Skip hierarchical access for columns without a path and use the flat index instead.","Assert path.length > 0 when building/validating column definitions, before any row access."],"exampleFix":"// before\nint[] idx = levels.toArray(new int[0]); // empty for top-level\ngetValue(row, idx);\n\n// after\nint[] idx = levels.isEmpty() ? new int[]{flatColIdx} : levels.stream().mapToInt(Integer::intValue).toArray();\ngetValue(row, idx);","handlingStrategy":"validation","validationCode":"if (hierarchicalIdx == null || hierarchicalIdx.length == 0) {\n  hierarchicalIdx = new int[]{column.getFlatIdx()};\n}","typeGuard":"static boolean isUsableIdx(@Nullable int[] idx) { return idx != null && idx.length > 0; }","tryCatchPattern":null,"preventionTips":["Guarantee every column definition produces at least a one-element path.","Unit-test column builders to reject empty hierarchy paths."],"tags":["datagrid","hierarchical-columns","validation","empty-argument"],"backgroundTag":null,"analyzedSha":"be881553f2a76ac8b4ea53950d93f0de78295c19","analyzedAt":"2026-08-14T14:13:06.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}