2012-05-30 4 views
0

У меня возникла разочаровывающая проблема со статическими переменными в приложении, которое я отлаживаю (я сам не сам его кодировал).Статическая переменная Java неожиданно сохраняется

У меня есть таблица базы данных mysql, называемая Transits. Транзиты имеют строковый столбец (varchar), который содержит дату (eventdt) формата «yyyy/MM/dd HH: mm: ss».

В моем соответствующем классе hibernate у меня есть переменная Date, которая будет хранить значение eventdt. Таким образом, когда eventdt читается, код преобразует его из строки в Date.

В коде используется SimpleDateFormat для преобразования. Программист использовал статический переменный для хранения формата, но, к сожалению, сделал ошибку форматирования:

private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss"); 

Оставив его как есть, каждая дата хранится в столбце eventdt, который находится на полдень часов сохраняется в соответствующей переменной Date как полночь. Очевидно, что это нежелательно, поэтому я попытался это исправить:

private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 

Однако код продолжает сохранять прежний формат «ГГГГ/ММ/ДД чч: мм: сс».

Я прочитал статические переменные и сделал все, что мог, чтобы очистить его. Я перекомпилировал код, затем перераспределил (на Glassfish 3.1.1). Я перезапустил Netbeans (7.1.1), а затем снова восстановил/повторно развернул. Я очистил тайники Netbeans и повторил тот же процесс. Затем я удалил всю установку Glassfish, перезагрузил, воссоздал домены, снова очистил кеш и прошел ту же перестройку/передислокацию.

Я также попытался изменить сам код. Я подумал, что это может быть проблемой нарезания резьбы, поэтому я изменил переменную статику окончательным:

private static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 

Тогда я изменил его так, что статический окончательные переменная строка формата, и экземпляр объекта DateFormat в каждом методе где это было необходимо:

// In class variable block 
private static final String DATETIME_FORMAT_PATTERN = "yyyy/MM/dd HH:mm:ss"; 

// In class methods 
DateFormat df = new SimpleDateFormat(DATETIME_FORMAT_PATTERN); 

Независимо от того, что я сделал, тот же ошибочный формат «дд/мм/гггг чч: мм: сс» сохраняется.

Единственное, что я могу думать о том, что я еще не сделал, - удалить и переустановить Netbeans. Я где-то читал, что обновление тоже помогло. Нужно ли мне зайти так далеко, чтобы очистить старую переменную?

я не пытался ставить код в синхронизированный блок или его инициализации THREADSAFE (хотя я даже не уверен, потоковая это вопрос здесь ...)

Я был бы признателен за любые указания, в правом направлении, поскольку у меня заканчиваются идеи. Благодаря!

Редактировать: В соответствии с запросом здесь используется код, который использует DateFormat. lpr - еще один объект Hibernate, объединяющий таблицу Transits и некоторые другие необходимые таблицы.

Date activityDate = null; 
    try { 
     activityDate = df.parse(getEventdt()); 
     lpr.setActivityDateTime(activityDate); 
    } catch (Exception e) { 
     logger.warn("Unable to parse " + getEventdt() + " as a date."); 
    } 
+0

Я также должен добавить, что я попытался найти весь исходный код для другого места, где может быть установлен DateFormat, но не нашел ни одного другого случая ошибочного формата. Помощь будет очень признательна! –

+2

Как вы проверили, что «* код продолжает сохранять предыдущий формат» yyyy/MM/dd hh: mm: ss «*»? SimpleDateFormat ** не является потокобезопасным [см. Этот пост, например] (http://stackoverflow.com/questions/6840803/simpledateformat-thread-safety). – assylias

+1

Это принципиально невозможно, что NetBeans - это проблема, которая даже не имеет смысла. Также имейте в виду, что 'SDF' не являются потокобезопасными, хотя это зависит от приложения, если это важно - это не связано с проблемой, которую вы видите. –

ответ

3

NetBeans вряд ли является виновником. Я предполагаю, что проблема заключается в развертывании, скорее всего, что jar, который статический формат даты компилируется, не развертывается.

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

Другая возможность заключается в том, что это не формат даты, ответственный за дату. Я бы поставил точку останова на линии и посмотрел, ударишь ли ты. Если вы нажмете его, использует ли он правильную строку форматирования?

+0

Я запустил код через отладчик несколько раз, и он всегда сталкивается с неправильной строкой форматирования. Я просто озадачен тем, откуда идет строка. Я неоднократно искал исходный код для другого объявления неправильного форматирования, и я продолжаю оставаться пустым. Вот почему я думал, что это может быть связано с тем, что переменная статична. –

+0

Вы проверяли наличие дубликатов файлов jar? –

+0

Я получил доступ к администратору стеклянной рыбы, и там есть только одна банка. Я даже пытался перераспределить его вручную (а не через netbeans) и иметь ту же проблему. –

Смежные вопросы