{"record":{"id":"31215ced57f4afaa","repo":"stanfordnlp/CoreNLP","slug":"numclasses-must-be-2-3-or-5","errorCode":null,"errorMessage":"numClasses must be 2, 3, or 5","messagePattern":"numClasses must be 2, 3, or 5","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/edu/stanford/nlp/sentiment/ReadSentimentDataset.java","lineNumber":387,"sourceCode":"    String dictionaryFilename = null;\n    String sentimentFilename = null;\n    String tokensFilename = null;\n    String parseFilename = null;\n    String splitFilename = null;\n\n    String trainFilename = null;\n    String devFilename = null;\n    String testFilename = null;\n\n    int numClasses = 5;\n\n    // find numClasses first so we can dynamically change the names of\n    // the ouput files\n    for (int argIndex = 0; argIndex < args.length; ++argIndex) {\n      if (args[argIndex].equalsIgnoreCase(\"-numClasses\")) {\n        numClasses = Integer.parseInt(args[argIndex + 1]);\n        if (numClasses != 2 && numClasses != 3 && numClasses != 5) {\n          throw new IllegalArgumentException(\"numClasses must be 2, 3, or 5\");\n        }\n        break;\n      }\n    }\n\n    int argIndex = 0;\n    while (argIndex < args.length) {\n      if (args[argIndex].equalsIgnoreCase(\"-dictionary\")) {\n        dictionaryFilename = args[argIndex + 1];\n        argIndex += 2;\n      } else if (args[argIndex].equalsIgnoreCase(\"-sentiment\")) {\n        sentimentFilename = args[argIndex + 1];\n        argIndex += 2;\n      } else if (args[argIndex].equalsIgnoreCase(\"-tokens\")) {\n        tokensFilename = args[argIndex + 1];\n        argIndex += 2;\n      } else if (args[argIndex].equalsIgnoreCase(\"-parse\")) {\n        parseFilename = args[argIndex + 1];","sourceCodeStart":369,"sourceCodeEnd":405,"githubUrl":"https://github.com/stanfordnlp/CoreNLP/blob/1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a/src/edu/stanford/nlp/sentiment/ReadSentimentDataset.java#L369-L405","documentation":"IllegalArgumentException from ReadSentimentDataset.main when -numClasses is given a value other than 2, 3, or 5; the sentiment dataset reader only supports binary, 3-class, and the standard 5-class SST splits.","triggerScenarios":"Passing e.g. -numClasses 4 or -numClasses 0 on the command line when converting the dataset.","commonSituations":"Users assuming arbitrary class counts are supported, or converting binary SST variants with an invalid intermediate number.","solutions":["Use -numClasses 2, 3, or 5 only","Omit the flag if the default is acceptable","Change model code if you truly need a different class count (not just the flag)"],"exampleFix":"// before\n-numClasses 4\n// after\n-numClasses 5","handlingStrategy":"validation","validationCode":"if (numClasses != 2 && numClasses != 3 && numClasses != 5) throw new IllegalArgumentException(\"numClasses must be 2, 3, or 5\");","typeGuard":null,"tryCatchPattern":"try { ReadSentimentDataset.main(args); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"numClasses\")) { System.err.println(\"Use -numClasses 2, 3, or 5\"); } else throw e; }","preventionTips":["Restrict CLI wrappers to allowed values 2/3/5","Validate script inputs before invoking the tool"],"tags":["cli","validation"],"backgroundTag":"invalid-enum-value","analyzedSha":"1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a","analyzedAt":"2026-09-10T02:24:07.274Z","contentChangedAt":"2026-09-10T02:24:07.274Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}