Перекомпилировать йодатиму?
Это мой первый раз, используя jodatime, и у меня есть ошибка переполнения стека, которую я не знаю, как исправить. Я создаю приложение для Android, которое должно отображать дни между созданием записи sqlite и сегодняшним днем. Насколько я могу сказать, все работает правильно, кроме йодатима. Я получил эту ошибку при сборке проекта
[2010-08-10 02:08:50 - Grow Journal Beta] обрабатывает org/joda/time/DateTimeUtils.class... [2010-08-10 02:08:50 - Grow Journal Beta] обрабатывает org/joda/time/DateTimeZone$1.class... [2010-08-10 02:08:50 - Grow Journal Beta] предупреждение: игнорирование атрибута InnerClasses для анонимного внутреннего класса, который не поставляется со связанным атрибутом EnclosingMethod. (Этот класс, вероятно, был создан неработающим компилятором.) [2010-08-10 02:08:50 - Grow Journal Beta] обрабатывает org/joda/time/DateTimeZone$Stub.class...
Это logcat:
08-13 22: 12: 11.823: ОШИБКА /AndroidRuntime(6537): необработанный обработчик: выход из основного потока из-за неисследованного исключения 08-13 22:12:11.893: ОШИБКА /AndroidRuntime(6537): java.lang.StackruError 08-13 22:12:11.893: ОШИБКА /AndroidRuntime(6537): на java.util.Hashtable.get(Hashtable.java:274) 08-13 22:12:11.893: ОШИБКА /AndroidRuntime(6537): на java.util.Properties.getProperty(Properties.java:177) 08-13 22:12:11.893: ОШИБКА /AndroidRuntime(6537): в java.lang.System.getProperty(System.java:440) 08-13 22:12:11.893: ОШИБКА /AndroidRuntime(6537): на java.lang.System.getProperty(System.java:412) 08-13 22:12:11.893: ОШИБКА /AndroidRuntime(6537): в org.joda.time.DateTimeZone.getDefault(DateTimeZone.java:132) 08-13 22:12:11.893: ОШИБКА /AndroidRuntime(6537): в org.joda.time.DateTimeZone.forID(DateTimeZone.java:190) 08-13 22:12:11.893: ОШИБКА /AndroidRuntime(6537): в org.joda.time.DateTimeZone.getDefault (DateTimeZone.java:132)
Посмотрев немного, я понял, что мне просто нужно перекомпилировать бинарный файл jodatime. Я использовал eclipse, создал новый проект и импортировал исходный код jodatime. Когда я пытаюсь скомпилировать, я получаю это в консоли:
Usage: java org.joda.time.tz.ZoneInfoCompiler <options> <source files>
Возможные варианты: -src Укажите, где читать исходные файлы. -dst Укажите, куда записывать сгенерированные файлы.
Не совсем уверен, куда идти отсюда. Любая помощь будет принята с благодарностью. Спасибо за ваше время.
StackTrace от переполнения:
Thread [main] (Suspended (исключение StackruError)) DateTimeZone.getDefault() строка: 147 ISOChronology.getInstance() строка: 86 DateTimeUtils.getChronology(хронология) строка: 231 ДатаКонвертер (AbstractConverter).getChronology (строка объекта, хронология): 82 строка: DateTime (BaseDateTime).(Object, Chronology) строка: 170 DateTime.(Object) строка: 168 PlantsCursorAdapter.newView(Context, Cursor, ViewGroup) строка: 71 PlantsCursorAdapter(CursorAdapter).getView(int, View, ViewGroup) строка: 182 ListView(AbsListView).obtainView(int) строка: 1274 ListView.measureHeightOfChildren(int, int, int, int, int) строка: 1147 ListView.onMeasure(int, int) строка: 1060 ListView(View).measure(int, int) line: 7966 TableLayout(ViewGroup).measureChildWithMargins(View, int, int, int, int) line: 3077 TableLayout(LinearLayout).measureChildBeforeLayout(View, int, int, int, int, int) line: 888 TableLayout.measureChildBeforeLay (View, int, int, int, int, int) строка: 453 TableLayout(LinearLayout).measureVertical(int, int) строка: 350 TableLayout.measureVertical(int, int) строка: 465 TableLayout.onMeasure(int, int) строка: 428 TableLayout(View).measure(int, int) строка: 7966 FrameLayout(ViewGroup).measureChildWithMargins(View, int, int, int), int) строка: 3077 FrameLayout.onMeasure(int, int) строка: 245 FrameLayout(View).measure(int, int) строка: 7966 LinearLayout.measureVertical(int, int) строка: 464 LinearLayout.onMeasure(int, int) строка: 278 LinearLayout(View).measure(int, int) строка: 7966 PhoneWindow$DecorView(ViewGroup).measureChildWithMargins(View, int, int, int, int) строка: 3077 PhoneWindow$DecorView(FrameLayout).onMeasure(int, int) строка: 245 PhoneWindow$DecorView(View).measure(int, int) строка: 7966 ViewRoot.performTraversals() строка: 767 ViewRoot.handleMessage(сообщение) строка: 1650 ViewRoot(обработчик).dispatchMessage(сообщение) строка: 99 Looper.loop() строка: 123 ActivityThread.main(String[]) строка: 4595 Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) строка: не доступно [собственный метод] Метод.invoke(Объект, Объект t...) строка: 521 ZygoteInit$MethodAndArgsCaller.run() строка: 860 ZygoteInit.main(String[]) строка: 618 NativeStart.main(String[]) строка: недоступно [собственный метод]
Источник DateTimeZone.class находится здесь
3 ответа
Проблемная рекурсия, по-видимому, между DateTimeZone.getDefault
а также DateTimeZone.forID
, Однако номера строк стека, похоже, не совпадают с исходным кодом Joda, который я здесь вижу. И в этом коде DateTimeZone.getDefault()
Метод не смотрит на системные свойства... это происходит в статическом инициализаторе.
Кажется, что кодовая база Android использует измененную версию JodaTime.
Во всяком случае, это похоже на вызов JodaTime.setDefault(...)
может быть обходным путем. Также убедитесь, что системное свойство user.timezone установлено.
(Я не думаю, что перекомпиляция / использование стандартного JodaTime является правильной стратегией. Android настраивает... какими бы они ни были... вероятно, есть причина.)
РЕДАКТИРОВАТЬ
Возвращаясь к этому, выясняется, что это было ошибкой в JodaTime 1.6.1 на некоторых платформах (Android, Google-Apps). Система отслеживания ошибок показывает это как исправлено в JodaTime 1.6.2.
У меня просто та же проблема, я думаю, что это ошибка в joda-time 1.6.1, потому что все работает хорошо с версией 1.6. Я опубликовал отчет об ошибке на трекере ошибок joda-time, и я использую версию 1.6.
Пауло
Почему вы не можете использовать что-то вроде:
SELECT julianday('now') - julianday('1776-07-04');
По вашему запросу?