stanfordnlp/CoreNLP · error · UnsupportedOperationException

CrossValidationIterator doesn't support remove()

Error message

CrossValidationIterator doesn't support remove()

What it means

UnsupportedOperationException raised by CrossValidator.CrossValidationIterator.remove(). Folds are precomputed, read-only views of the dataset, so mutation through the Iterator contract is deliberately unsupported; it fires only if code calls remove() while iterating folds.

Solutions

  1. Do not call remove() on the cross-validation iterator
  2. Mutate the underlying dataset directly instead of through the iterator
  3. Wrap iteration in code that only reads folds
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at src/edu/stanford/nlp/classify/CrossValidator.java:70 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of stanfordnlp/CoreNLP@1b7edd19c4 (2026-09-10). Data as JSON: /api/errors/ce7ddf98384eeb9b. Report an issue: GitHub.

Appendix: source

Thrown at src/edu/stanford/nlp/classify/CrossValidator.java:70

    double sum = 0;
    Iterator<Triple<GeneralDataset<L, F>,GeneralDataset<L, F>,SavedState>> foldIt = iterator();
    while (foldIt.hasNext()) {
      sum += function.applyAsDouble(foldIt.next());
    }
    return sum / kFold;
  }


  class CrossValidationIterator implements Iterator<Triple<GeneralDataset<L, F>,GeneralDataset<L, F>,SavedState>> {

    private int iter = 0;

    @Override
    public boolean hasNext() { return iter < kFold; }

    @Override
    public void remove() {
      throw new UnsupportedOperationException("CrossValidationIterator doesn't support remove()");
    }

    @Override
    public Triple<GeneralDataset<L, F>,GeneralDataset<L, F>,SavedState> next() {
      if (iter == kFold) throw new NoSuchElementException("CrossValidatorIterator exhausted.");
      int start = originalTrainData.size() * iter / kFold;
      int end = originalTrainData.size() * (iter + 1) / kFold;
      //Logging.logger(this.getClass()).info("##train data size: " +  originalTrainData.size() + " start " + start + " end " + end);
      Pair<GeneralDataset<L, F>, GeneralDataset<L, F>> split = originalTrainData.split(start, end);

      return new Triple<>(split.first(), split.second(), savedStates[iter++]);
    }

  } // end class CrossValidationIterator


  public static class SavedState {
    public Object state;

View on GitHub (pinned to 1b7edd19c4)