У вас есть функция, которая создает объект Date. (почему это требуется, это длинная история, которая не имеет отношения к этому контексту, но мне нужно сравнить с некоторыми материалами в мире XML, где ВРЕМЯ (то есть время) является действительной концепцией).
private static final SimpleDateFormat DF_TIMEONLY = new SimpleDateFormat("HH:mm:ss.SSSZ");
public static Date getCurrentTimeOnly() {
String onlyTimeStr = DF_TIMEONLY.format(new Date()); // line #5
Date onlyTimeDt = null;
try {
onlyTimeDt = DF_TIMEONLY.parse(onlyTimeStr); // line #8
} catch (ParseException ex) {
// can never happen (you would think!)
}
return onlyTimeDt;
}
Возможно, существует, по меньшей мере, несколько других способов создания даты с датой только в Java (или, точнее, в том случае, когда дата составляет 1970-01-01), но мой вопрос действительно не в этом.
Мой вопрос заключается в том, что этот кусок кода начинает беспорядочно бросать NumberFormatException на строку # 8 после долгого запуска. Технически я бы сказал, что это должно быть невозможно, верно?
Здесь выдержка из случайных NumberFormatExceptions, которые исходят из вышеприведенного фрагмента кода:
java.lang.NumberFormatException: multiple points
java.lang.NumberFormatException: For input string: ".11331133EE22"
java.lang.NumberFormatException: For input string: "880044E.3880044"
java.lang.NumberFormatException: For input string: "880044E.3880044E3"
Прежде всего, я надеюсь, что мы можем согласиться с тем, что формально это должно быть невозможно? Код использует тот же формат (DF_TIMEONLY
) как вывод, а затем вводит. Дайте мне знать, если вы не согласны с тем, что это невозможно.
Я не смог повторно создать проблему в автономной среде. Проблема, похоже, возникает, когда JVM работает в течение длительного времени ( > 1 неделя). Я не могу найти шаблон проблемы, то есть летнее время/зима, AM/PM и т.д. Ошибка является спорадической, а это означает, что в течение одной минуты она выкинет NumberFormatException и в следующую минуту она будет работать нормально.
Я подозреваю, что существует какая-то арифметическая неисправность где-то в JVM или даже в CPU. Вышеизложенные исключения указывают на наличие числа с плавающей запятой, но я не вижу, откуда они будут. Насколько я знаю, объект Java Date - это обертка вокруг long
, которая содержит количество миллисов с эпохи.
Я предполагаю, что происходит то, что в строке # 5 создается непредвиденная строка onlyTimeStr
, поэтому проблема действительно лежит здесь, а не в строке # 8.
Вот пример полного stacktrace:
java.lang.NumberFormatException: For input string: "880044E.3880044E3"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
at java.lang.Double.parseDouble(Double.java:540)
at java.text.DigitList.getDouble(DigitList.java:168)
at java.text.DecimalFormat.parse(DecimalFormat.java:1321)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2086)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1455)
at java.text.DateFormat.parse(DateFormat.java:355)
at org.mannmann.zip.Tanker.getCurrentTimeOnly(Tanker.java:746)
Среда: Java 7