0

这是我第一次使用 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 指定写入生成文件的位置

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

StackTrace 来自溢出:

线程 [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 源在这里

4

3 回答 3

2

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

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

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

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

编辑

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

于 2010-08-14T04:55:57.237 回答
0

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

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

在您的查询中?

于 2010-08-14T17:51:32.880 回答
0

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

保罗

于 2010-08-19T08:55:31.103 回答