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
- Check the exact day string reaching the filter — it must start with ут/ср/че/пе/су/не (or equal a known full name).
- Normalize case and trim whitespace before the filter processes the token.
- If handling inflected day forms, extend the prefix/full-name checks in DateCheckFilter.getDayOfWeek.
- 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
- Normalize case, trim, and unify script (Cyrillic vs Latin) before calling the filter.
- Keep rule regexes anchored to nominative weekday forms.
- Add unit tests covering every weekday form your rules can produce.
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
- Месец '<monthStr>' не постоји.
- Could not find day of week for '" + dayStr + "'
- Could not find month '" + monthStr + "'
- Could not find day of week for '" + dayStr + "'
- Could not find month '" + monthStr + "'
AI-assisted analysis of languagetool-org/languagetool@2e990059ce (2026-09-06).
Data as JSON: /api/errors/9aeed2b8e198a063.
Report an issue: GitHub.