{"record":{"id":"0f7ee2613504706f","repo":"JetBrains/intellij-community","slug":"inner-class-with-name-0-already-exists","errorCode":null,"errorMessage":"Inner class with name ''{0}'' already exists","messagePattern":"Inner class with name ''(.+?)'' already exists","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"warning","filePath":"java/java-impl-refactorings/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectDialog.java","lineNumber":483,"sourceCode":"    final ParameterInfoImpl[] infos = parameters.toArray(new ParameterInfoImpl[0]);\n    return new JavaIntroduceParameterObjectClassDescriptor(className, packageName, moveDestination, useExistingClass, createInnerClass,\n                                                           newVisibility, infos, mySourceMethod,\n                                                           myGenerateAccessorsCheckBox.isSelected());\n  }\n\n  @Override\n  protected void canRun() throws ConfigurationException {\n    super.canRun();\n    final Project project = mySourceMethod.getProject();\n    final PsiNameHelper nameHelper = PsiNameHelper.getInstance(project);\n    if (myCreateInnerClassRadioButton.isSelected()) {\n      final String innerClassName = getInnerClassName();\n      if (!nameHelper.isIdentifier(innerClassName)) {\n        throw new ConfigurationException(\n          JavaRefactoringBundle.message(\"introduce.parameter.object.error.invalid.inner.class.name\", innerClassName));\n      }\n      if (mySourceMethod.getContainingClass().findInnerClassByName(innerClassName, false) != null) {\n        throw new ConfigurationException(\n          JavaRefactoringBundle.message(\"introduce.parameter.object.error.inner.class.already.exist\", innerClassName));\n      }\n    }\n    else if (!useExistingClass()) {\n      final String className = getClassName();\n      if (className.isEmpty() || !nameHelper.isIdentifier(className)) {\n        throw new ConfigurationException(\n          JavaRefactoringBundle.message(\"introduce.parameter.object.error.invalid.parameter.class.name\", className));\n      }\n      final String packageName = getPackageName();\n\n      if (packageName.isEmpty() || !nameHelper.isQualifiedName(packageName)) {\n        throw new ConfigurationException(\n          JavaRefactoringBundle.message(\"introduce.parameter.object.error.invalid.parameter.class.package.name\", packageName));\n      }\n    }\n    else {\n      final String className = getExistingClassName();","sourceCodeStart":465,"sourceCodeEnd":501,"githubUrl":"https://github.com/JetBrains/intellij-community/blob/be881553f2a76ac8b4ea53950d93f0de78295c19/java/java-impl-refactorings/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectDialog.java#L465-L501","documentation":"Thrown by IntroduceParameterObjectDialog.canRun() (IntroduceParameterObjectDialog.java:483) when the chosen inner class name collides with an existing member: PsiClass.findInnerClassByName(innerClassName, false) returns non-null in the containing class. The refactoring would otherwise generate a duplicate class declaration, so the dialog blocks it. This is a name-collision check, not a syntax check.","triggerScenarios":"Introduce Parameter Object with 'Create inner class' selected and a name that already names an inner class (including non-executable/annotation inner classes) of the source method's containing class. For example the method lives in Foo and 'FooParams' already exists inside Foo.","commonSituations":"Running the refactoring twice and accepting the default suggested name a second time, or manually typing a name of a nested class you forgot about; also nested classes not visible in the Project view.","solutions":["Pick a different inner class name in the dialog (e.g. suffix it: 'Params2', 'RequestWrapper').","Or rename/delete the existing colliding inner class first via Safe Delete / Rename.","Or switch the dialog to the 'Use existing class' option and select the class that already exists."],"exampleFix":"// before\n// containing class already declares:\n// class Foo { static class FooParams {} void m(int a) {...} }\n// dialog inner class name: FooParams  -> ConfigurationException\n\n// after\n// dialog inner class name: FooRequestParams  -> no collision, refactoring proceeds","handlingStrategy":"validation","validationCode":"PsiClass container = mySourceMethod.getContainingClass();\nString innerClassName = getInnerClassName();\nif (container.findInnerClassByName(innerClassName, false) != null) {\n  // suggest a non-colliding name before running the refactoring\n  innerClassName = innerClassName + \"Params\"; // or open a chooser\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["When scripting, always probe findInnerClassByName before committing to a generated name.","Prefer a distinctive suffix ('Params', 'Wrapper') over generic names that easily collide."],"tags":["intellij","refactoring","java","name-collision","inner-class"],"backgroundTag":null,"analyzedSha":"be881553f2a76ac8b4ea53950d93f0de78295c19","analyzedAt":"2026-08-14T14:13:06.425Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}