languagetool-org/languagetool · error · RuntimeException

Редни број дана у недељи за '<dayStr>' не постоји.

Error message

Редни број дана у недељи за '<dayStr>' не постоји.

What it means

DateCheckFilter for Serbian maps a day-of-week token (Serbian Cyrillic/Latin day names or abbreviations) to a java.util.Calendar constant. If the token matches none of the recognized prefixes/full names, getDayOfWeek throws this RuntimeException indicating the day string is not a recognized Serbian weekday.

Source

Thrown at languagetool-language-modules/sr/src/main/java/org/languagetool/rules/sr/DateCheckFilter.java:49

public class DateCheckFilter extends AbstractDateCheckFilter {

  @Override
  protected Calendar getCalendar() {
    return Calendar.getInstance(Locale.forLanguageTag("sr"));
  }

  @SuppressWarnings("ControlFlowStatementWithoutBraces")
  @Override
  protected int getDayOfWeek(String dayStr) {
    String day = dayStr.toLowerCase();
    if (day.startsWith("по") || day.equals("понедељак")) return Calendar.MONDAY;
    if (day.startsWith("ут")) return Calendar.TUESDAY;
    if (day.startsWith("ср")) return Calendar.WEDNESDAY;
    if (day.startsWith("че") || day.equals("четвртак")) return Calendar.THURSDAY;
    if (day.startsWith("пе") || day.equals("петак")) return Calendar.FRIDAY;
    if (day.startsWith("су") || day.equals("субота")) return Calendar.SATURDAY;
    if (day.startsWith("не") || day.equals("недеља")) return Calendar.SUNDAY;
    throw new RuntimeException("Редни број дана у недељи за '" + dayStr + "' не постоји.");
  }

  @Override
  protected String getDayOfWeek(Calendar date) {
    return date.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.forLanguageTag("sr"));
  }

  @SuppressWarnings({"ControlFlowStatementWithoutBraces", "MagicNumber"})
  @Override
  protected int getMonth(String monthStr) {
    String mon = monthStr.toLowerCase();
    if (mon.equals("јануар") || monthStr.equals("I") || mon.equals("јануара") || mon.equals("јан")) return 1;
    if (mon.equals("фебруар") || monthStr.equals("II") || mon.equals("фебруара") || mon.equals("феб")) return 2;
    if (mon.equals("март") || monthStr.equals("III") || mon.equals("марта") || mon.equals("мар")) return 3;
    if (mon.equals("април") || monthStr.equals("IV") || mon.equals("априла") || mon.equals("апр")) return 4;
    if (mon.equals("мај") || monthStr.equals("V") || mon.equals("маја")) return 5;
    if (mon.equals("јун") || monthStr.equals("VI") || mon.equals("јуна") || mon.equals("јун")) return 6;
    if (mon.equals("јул") || monthStr.equals("VII") || mon.equals("јула") || mon.equals("јул")) return 7;

View on GitHub (pinned to 2e990059ce)

Solutions

  1. Check the exact day string reaching the filter — it must start with ут/ср/че/пе/су/не (or equal a known full name).
  2. Normalize case and trim whitespace before the filter processes the token.
  3. If handling inflected day forms, extend the prefix/full-name checks in DateCheckFilter.getDayOfWeek.
  4. Ensure the rule/regex produces the nominative day form the filter expects.

Example fix

// before: unrecognized form thrown at runtime
throw new RuntimeException("Редни број дана у недељи за '" + dayStr + "' не постоји.");
// after: normalize and guard in the caller before invoking the filter
String day = dayStr.trim().toLowerCase(Locale.forLanguageTag("sr"));
if (!(day.startsWith("ут") || day.startsWith("ср") || day.startsWith("че") ||
      day.startsWith("пе") || day.startsWith("су") || day.startsWith("не"))) {
  throw new IllegalArgumentException("Unrecognized Serbian day of week: " + dayStr);
}
Defensive patterns

Strategy: validation

Validate before calling

private static final List<String> SR_DAY_PREFIXES = List.of("ут","ср","че","пе","су","не");
boolean isRecognizedSerbianDay(String dayStr) {
  String d = dayStr == null ? "" : dayStr.trim().toLowerCase(Locale.forLanguageTag("sr"));
  return SR_DAY_PREFIXES.stream().anyMatch(d::startsWith);
}

Try / catch

try {
  int dayOfWeek = filter.getDayOfWeek(dayStr);
} catch (RuntimeException e) {
  logger.warn("Unrecognized Serbian day token: {}", dayStr);
  // skip rule match or treat date as invalid
}

Prevention

When it happens

Trigger: Passing a day string like 'пн', 'mon', a misspelled weekday, or an inflected form (e.g. 'уторком') that does not start with any recognized prefix ('ут', 'ср', 'че', 'пе', 'су', 'не') into getDayOfWeek via a date-matching rule.

Common situations: Grammar rules matching date expressions that include locative/instrumental day forms; locale changes producing Latin-script output while the filter expects Cyrillic (or vice versa); typos in custom rule XML tokens.

Related errors


AI-assisted analysis of languagetool-org/languagetool@2e990059ce (2026-09-06). Data as JSON: /api/errors/9aeed2b8e198a063. Report an issue: GitHub.