Различия между исключениями парсинга simpledateformat и альтернативными методами

private final static SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("ddMMMyy", Locale.ENGLISH);  //method 1

private static  Date getSimpleDate(String sDate) throws ParseException{
    SimpleDateFormat F = new  SimpleDateFormat("ddMMMyy", Locale.ENGLISH);
    System.out.println("pDAte:"+ F.parse(sDate).toString());
    return F.parse(sDate);
} //[method 2]


private static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() { 
    @Override
    protected SimpleDateFormat initialValue() {
        return new SimpleDateFormat("ddMMMyy", Locale.ENGLISH);// [method 3]
    }
};  //method3

private final static DateTimeFormatter DATE_FORMATTER = 
        new DateTimeFormatterBuilder().parseCaseInsensitive()
                                      .appendPattern("ddMMMyy")
                                      .toFormatter();  //[method 4]

Когда я проанализировал дату с помощью метода 1, я столкнулся с большим количеством исключений,

java.lang.NumberFormatException: For input at 
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

а также

java.lang.NumberFormatException: For input string: ".1818E2.1818E2" 
            at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)

сначала мой вопрос: это значение ".1818E2.1818E2" я не устанавливаю это значение, но сталкиваюсь. Откуда приходит значение. Хотя я устанавливаю значение даты правильно с правильным форматом, я сталкиваюсь с этой проблемой.

Но другие методы (метод2, метод3, метод4) работают. и решил проблемы. Эти три метода являются альтернативными решениями. Второй мой вопрос, в чем отличия этого метода.

public Date getDscDateAsDate() throws ParseException {
    if(getDscDate()!=null) {
        return SIMPLE_DATE_FORMAT.parse(getDscDate());
    }
    return null;                
}

Вы показываете методы, но не вызовы. Не могли бы вы добавить их, так как это может быть там, где есть проблемы.

JoeG 31.10.2018 11:40

@JoeG добавил блок

Yasin 31.10.2018 11:50
0
2
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

SimpleDateFormat не является потокобезопасным:

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

«Java DateFormat не является потокобезопасным», к чему это приводит?

В методе 1 вы используете экземпляр SimpleDateFormat в нескольких потоках, эти потоки могут одновременно устанавливать некоторые поля этого SimpleDateFormat, создавая недопустимые промежуточные результаты, такие как .1818E2.1818E2. Вы можете проверить полную трассировку стека этого исключения, чтобы получить дополнительную информацию.

В методе 2 и методе 3 каждый поток имеет свой собственный экземпляр SimpleDateFormat. Так что все в порядке.

В методе 4 вы используете DateTimeFormatter, он ориентирован на многопоточность.

Отличный пикап - вы должны были сделать вывод из вопроса. Очень хорошо!

JoeG 31.10.2018 12:12

Другие вопросы по теме