Имейте функцию, которая создает объект Date с ограничением по времени. (почему это требуется, это длинная история, которая не имеет отношения к этому контексту, но мне нужно сравнить с некоторыми материалами в мире XML, где ВРЕМЯ (то есть время) является действительной концепцией).NumberFormatException во время разбора
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 on line # 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. Вышеизложенные исключения показывают, что есть числа с плавающей запятой, но я не вижу, откуда они будут. Насколько я знаю, объект Date Java является оберткой вокруг long
, которая содержит количество миллисов с эпохи.
Я предполагаю, что происходит непредвиденная строка onlyTimeStr
, созданная в строке # 5, поэтому проблема действительно лежит здесь, а не в строке # 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
И что еще? Вы ловите ParseException или что? Каков ваш вопрос? Я не получаю никаких ошибок при запуске вашего фрагмента. – sp00m
Что такое stacktrace? –
Где проблема? – Sergi