{"record":{"id":"75ecc860cdb0f13f","repo":"stanfordnlp/CoreNLP","slug":"extractors-can-t-both-be-local-and-dynamic","errorCode":null,"errorMessage":"Extractors can't both be local and dynamic!","messagePattern":"Extractors can't both be local and dynamic!","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/edu/stanford/nlp/tagger/maxent/Extractors.java","lineNumber":57,"sourceCode":"    v = new Extractor[extrs.length];\n    System.arraycopy(extrs, 0, v, 0, extrs.length);\n    initTypes();\n  }\n\n\n  /**\n   * Determine type of each feature extractor.\n   */\n  void initTypes() {\n\n    local = new ArrayList<>();\n    localContext = new ArrayList<>();\n    dynamic = new ArrayList<>();\n\n    for(int i=0; i<v.length; ++i) {\n      Extractor e = v[i];\n      if(e.isLocal() && e.isDynamic())\n        throw new RuntimeException(\"Extractors can't both be local and dynamic!\");\n      if(e.isLocal()) {\n        local.add(Pair.makePair(i,e));\n        //localContext.put(i,e);\n      } else if(e.isDynamic()) {\n        dynamic.add(Pair.makePair(i,e));\n      } else {\n        localContext.add(Pair.makePair(i,e));\n      }\n    }\n    if(DEBUG) {\n      log.info(\"Extractors: \" + this);\n      log.info(\"Local: \" + local.size() + \" extractors\");\n      log.info(\"Local context: \" + localContext.size() + \" extractors\");\n      log.info(\"Dynamic: \" + dynamic.size() + \" extractors\");\n    }\n  }\n\n  /**","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/stanfordnlp/CoreNLP/blob/1b7edd19c4d0d7b1f13a2591425b9b60a0b1af7a/src/edu/stanford/nlp/tagger/maxent/Extractors.java#L39-L75","documentation":"Extractors.initTypes classifies each Extractor as local (depends only on the local sentence window) or dynamic (stateful across the sequence). An extractor reporting both isLocal() and isDynamic() is a contradiction and triggers this RuntimeException. It guards an internal invariant of the feature extraction model.","triggerScenarios":"Building an Extractors instance (e.g. via new Extractors(Extractor[])) containing a custom extractor whose isLocal() and isDynamic() both return true; loading a serialized model with such an extractor.","commonSituations":"Writing a custom Extractor subclass and overriding isLocal()/isDynamic() incorrectly (e.g. returning true in both); mixing extractors from incompatible code versions where defaults changed.","solutions":["Fix the custom extractor so exactly one of isLocal()/isDynamic() returns true (typically local=true, dynamic=false)","If the extractor needs cross-position state, make it dynamic only (isLocal()=false, isDynamic()=true)","Check the Extractor superclass defaults and only override what you need","If loading an old model file, retrain with extractors from the same library version"],"exampleFix":"// before\n@Override public boolean isLocal() { return true; }\n@Override public boolean isDynamic() { return true; } // contradiction\n// after\n@Override public boolean isLocal() { return true; }\n@Override public boolean isDynamic() { return false; }","handlingStrategy":"validation","validationCode":"for (Extractor e : extractors) {\n  if (e.isLocal() && e.isDynamic()) {\n    throw new IllegalArgumentException(\"Extractor must be local or dynamic, not both: \" + e.getClass().getName());\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  new Extractors(extractorArray);\n} catch (RuntimeException e) {\n  if (e.getMessage() != null && e.getMessage().equals(\"Extractors can't both be local and dynamic!\")) {\n    // find and fix the offending extractor's isLocal/isDynamic overrides\n  } else { throw e; }\n}","preventionTips":["In custom Extractor subclasses, return true for exactly one of isLocal/isDynamic","Rely on the Extractor superclass defaults instead of overriding both flags","Validate extractor arrays programmatically before constructing Extractors","Retrain models when upgrading across versions with changed extractor defaults"],"tags":["java","pos-tagger","invariant","custom-extractor"],"backgroundTag":"internal-invariant-violation","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"}