【问题标题】:Recompile jodatime?重新编译jodatime?
【发布时间】:2010-08-14 03:14:25
【问题描述】:

这是我第一次使用 jodatime,但我遇到了一个我不知道如何修复的 stackoverflow 错误。我正在创建一个 android 应用程序,该应用程序需要能够显示从创建 sqlite 记录到今天之间的天数。据我所知,除 jodatime 外,一切正常。构建项目时出现此错误

[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] 警告:忽略不带有关联 EnclosureMethod 属性的匿名内部类的 InnerClasses 属性。 (此类可能是由损坏的编译器生成的。) [2010-08-10 02:08:50 - Grow Journal Beta] 处理 org/joda/time/DateTimeZone$Stub.class...

这是日志猫:

08-13 22:12:11.823:错误/AndroidRuntime(6537):未捕获的处理程序:线程主因未捕获的异常而退出 08-13 22:12:11.893: 错误/AndroidRuntime(6537): java.lang.StackOverflowError 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 指定写入生成文件的位置

不确定从这里去哪里。任何帮助将不胜感激。感谢您的宝贵时间。

来自溢出的堆栈跟踪:

Thread [ main](暂停(StackOverflowError 异常))
    DateTimeZone.getDefault() 行:147
    ISOChronology.getInstance() 行:86
    DateTimeUtils.getChronology(Chronology) 行:231
    DateConverter(AbstractConverter).getChronology(Object, Chronology) 行:82
    DateTime(BaseDateTime).(Object, Chronology) 行:170
    日期时间。(对象)行: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) 行:7966
    TableLayout(ViewGroup).measureChildWithMargins(View, int, int, int, int) 行:3077
    TableLayout(LinearLayout).measureChildBeforeLayout(View, int, int, int, int, int) 行:888
    TableLayout.measureChildBeforeLayout(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(Message) 行:1650
    ViewRoot(Handler).dispatchMessage(Message) 行:99
    Looper.loop() 行:123
    ActivityThread.main(String[]) 行:4595
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) 行:不可用 [本机方法]
    Method.invoke(Object, Object...) 行:521
    ZygoteInit$MethodAndArgsCaller.run() 行:860
    ZygoteInit.main(String[]) 行:618
    NativeStart.main(String[]) 行:不可用 [本机方法]

DateTimeZone.class 来源是Here

【问题讨论】:

  • 你确定 stacktrace 不是更长了吗? StackOverflow 通常是递归错误
  • 我已经添加了我拥有的跟踪
  • @Lord.Quackstar - 递归在 DateTimeZone.getDefaultDateTimeZone.forID 之间。

标签: java android jodatime


【解决方案1】:

有问题的递归显然在DateTimeZone.getDefaultDateTimeZone.forID 之间。但是,堆栈行号似乎与我看到的 Joda 源代码 here 不一致。在该代码中,DateTimeZone.getDefault() 方法不查看系统属性......这些东西发生在静态初始化程序中。

Android 代码库似乎使用了经过调整的 JodaTime 版本。

无论如何,看起来调用JodaTime.setDefault(...) 可能是一种解决方法。此外,检查“user.timezone”系统属性是否已设置。

(我不认为重新编译/使用标准 JodaTime 是正确的策略。Android 调整......不管它们是什么......可能是有原因的。)

编辑

重新审视这一点,发现这是某些平台(Android、Google-Apps)上 JodaTime 1.6.1 中的一个错误。问题跟踪器显示它在 JodaTime 1.6.2 中已修复。

【讨论】:

  • 我不相信 jodatime 包含在 Android 代码库中,因为我必须导入库。我添加了一个链接到更新的 DateTimeZone 类,我正在使用并使用谷歌代码搜索找到。
【解决方案2】:

为什么你不能使用类似的东西:

SELECT julianday('now') - julianday('1776-07-04');  

在您的查询中?

【讨论】:

  • 我之前从未在 java 中使用原始查询来获取 sqlite,您能否举一个快速示例来查找从现在到 TABLE_A 中的 DATE 字段之间的天数,该字段也与我分配的变量匹配一个字段,例如 HOME_ID。我被指为 jodatime 的易用性或使用性,但对我来说似乎恰恰相反。
【解决方案3】:

我只是有同样的问题,我认为这是 joda-time 1.6.1 中的一个错误,因为在 1.6 版本中运行良好。我在 joda-time 错误跟踪器上发布了错误报告,我使用的是 1.6 版本。

保罗

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多