{"record":{"id":"3431d9460e21b59f","repo":"JetBrains/intellij-community","slug":"given-column-index-colidx-is-not-valid-3431d9","errorCode":null,"errorMessage":"\"Given column index \" + colIdx + \" is not valid.\"","messagePattern":"\"Given column index \" \\+ colIdx \\+ \" is not valid\\.\"","errorType":"validation","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"grid/core-impl/src/datagrid/GridWrapperNestedTable.java","lineNumber":71,"sourceCode":"  @Override\n  public int getColumnsNum() {\n    return myGridModel.getColumnCount();\n  }\n\n  @Override\n  public boolean isValidRowIdx(int rowIdx) {\n    return myGridModel.isValidRowIdx(ModelIndex.forRow(myGridModel, rowIdx));\n  }\n\n  @Override\n  public boolean isValidColumnIdx(int colIdx) {\n    return myGridModel.isValidColumnIdx(ModelIndex.forColumn(myGridModel, colIdx));\n  }\n\n  @Override\n  public int getColumnType(int colIdx) {\n    if (!isValidColumnIdx(colIdx)) {\n      throw new IllegalStateException(\"Given column index \" + colIdx + \" is not valid.\");\n    }\n    return Objects.requireNonNull(myGridModel.getColumn(ModelIndex.forColumn(myGridModel, colIdx))).getType();\n  }\n\n  @Override\n  public String getColumnTypeName(int colIdx) {\n    if (!isValidColumnIdx(colIdx)) {\n      throw new IllegalStateException(\"Given column index \" + colIdx + \" is not valid.\");\n    }\n    return Objects.requireNonNull(myGridModel.getColumn(ModelIndex.forColumn(myGridModel, colIdx))).getTypeName();\n  }\n\n  @Override\n  public String getColumnName(int colIdx) {\n    if (!isValidColumnIdx(colIdx)) {\n      throw new IllegalStateException(\"Given column index \" + colIdx + \" is not valid.\");\n    }\n    return Objects.requireNonNull(myGridModel.getColumn(ModelIndex.forColumn(myGridModel, colIdx))).getName();","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/JetBrains/intellij-community/blob/be881553f2a76ac8b4ea53950d93f0de78295c19/grid/core-impl/src/datagrid/GridWrapperNestedTable.java#L53-L89","documentation":"GridWrapperNestedTable.getColumnType(int) throws IllegalStateException when colIdx fails the delegated isValidColumnIdx check (ModelIndex.forColumn conversion + model's own bounds check). Unlike DynamicNestedTable which uses IllegalArgumentException, this wrapper signals a model-state problem.","triggerScenarios":"Calling getColumnType with a column index valid for a different column provider, or after the underlying model's columns changed (setColumns/clearColumns) while an old index was retained.","commonSituations":"Renderer or type-based formatting code holding a column index across a schema change; mixing nested-table column indexes with top-level grid column indexes.","solutions":["Call isValidColumnIdx(colIdx) on the wrapper before getColumnType.","Invalidate cached column indexes on column-structure change events.","Resolve columns by GridColumn identity instead of raw int where possible."],"exampleFix":"// before\nint type = wrapper.getColumnType(colIdx);\n\n// after\nif (wrapper.isValidColumnIdx(colIdx)) {\n  int type = wrapper.getColumnType(colIdx);\n}","handlingStrategy":"validation","validationCode":"int type = wrapper.isValidColumnIdx(colIdx) ? wrapper.getColumnType(colIdx) : -1;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Invalidate column-index caches on setColumns/clearColumns.","Never pass nested-table indexes to the top-level wrapper or vice versa."],"tags":["datagrid","grid-wrapper","index-validation","columns"],"backgroundTag":null,"analyzedSha":"be881553f2a76ac8b4ea53950d93f0de78295c19","analyzedAt":"2026-08-14T14:13:06.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}