Почему синтаксический анализ SimpleDateFormat выполняется без букв?

Когда я запускаю следующий код, я ожидал бы stacktrace, но вместо этого он выглядит так, будто он игнорирует ошибочную часть моего значения, почему это происходит?

package test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {
  public static void main(final String[] args) {
    final String format = "dd-MM-yyyy";
    final String value = "07-02-201f";
    Date date = null;
    final SimpleDateFormat df = new SimpleDateFormat(format);
    try {
      df.setLenient(false);
      date = df.parse(value.toString());
    } catch (final ParseException e) {
      e.printStackTrace();
    }
    System.out.println(df.format(date));
  }

}

Вывод:

07-02-0201

Ответ 1

Документация DateFormat.parse (которая унаследована SimpleDateFormat) говорит:

The method may not use the entire text of the given string.
final String value = "07-02-201f";

В вашем случае (201f) он смог проанализировать допустимую строку до 201, поэтому она не давала вам никаких ошибок.

Раздел "Броски" того же метода определяется следующим образом:

ParseException - if the beginning of the specified string cannot be parsed

Итак, если вы попытаетесь изменить строку на

final String value = "07-02-f201";

вы получите исключение синтаксического анализа, так как начало указанной строки не может быть проанализировано.

Ответ 2

Вы можете посмотреть, была ли вся строка проанализирована следующим образом.

  ParsePosition position = new ParsePosition(0);
  date = df.parse(value, position);
  if (position.getIndex() != value.length()) {
      throw new ParseException("Remainder not parsed: "
              + value.substring(position.getIndex()));
  }

Кроме того, когда исключение было выбрано parse, position также даст getErrorIndex().

Ответ 3

Подтверждено... Я также обнаружил, что компиляция "07-02-201", "07-02-2012 - дата". Однако, "bar07-02-2011" не делает.

Из кода в SimpleDateFormat кажется, что разбор завершается в тот момент, когда найден незаконный символ, который разбивает соответствие. Однако, если строка, которая уже была проанализирована до этой точки, действительна, она принимается.