只有部分用户报告“未找到资源”错误。这有意义吗?

时间:2012-05-24 18:29:01

标签: java android jodatime crittercism

我发现针对我发布的Android应用的Crittercism(崩溃报告服务)出现了一些错误。跟踪如下:

0   java.io.IOException: Resource not found: "org/joda/time/tz/data/ZoneInfoMap" ClassLoader: dalvik.system.PathClassLoader@45908320
1    at org.joda.time.tz.ZoneInfoProvider.openResource(ZoneInfoProvider.java:211)
2    at org.joda.time.tz.ZoneInfoProvider.<init>(ZoneInfoProvider.java:123)
3    at org.joda.time.tz.ZoneInfoProvider.<init>(ZoneInfoProvider.java:82)
4    at org.joda.time.DateTimeZone.getDefaultProvider(DateTimeZone.java:462)
5    at org.joda.time.DateTimeZone.setProvider0(DateTimeZone.java:416)
6    at org.joda.time.DateTimeZone.<clinit>(DateTimeZone.java:115)
7    at org.joda.time.chrono.GregorianChronology.<clinit>(GregorianChronology.java:71)
8    at org.joda.time.chrono.ISOChronology.<clinit>(ISOChronology.java:66)
9    at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:61)
10   at org.joda.time.DateTime.<init>(DateTime.java:155)

搜索显示这通常是一个编译问题(通常是Joda时间库没有添加到构建路径或其他东西),但那么为什么只有大约4个用户会看到这个错误?

我唯一的猜测是有人试图反编译应用程序以盗版它(它是一个相当受欢迎的付费应用程序),并在错误地重新编译时看到此错误。在这种情况下,我很高兴他们看到错误,我不需要担心这一点。

另一个奇怪的是导致问题的代码被try / catch包围,似乎没有抓住它:

try {
    DateTime dt = new DateTime();
    DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
    return fmt.print(dt);
} catch (Exception e) {
    //Report issue to Analytics service
} 

对我来说,这个错误似乎更不可能出现在Crittercism上,因为它应该被抓住了。谁能解释一下呢?

3 个答案:

答案 0 :(得分:71)

如果您错过了初始化,可能会发生这种情况:

JodaTimeAndroid.init(this);

答案 1 :(得分:0)

我从一个流行的免费应用程序中看到类似的,不常见的报告。到目前为止我还没有复制它。网络上有various referencesproblem,而不是所有涉及Android的内容。

一条线索:ZoneInfoMap是原始jar中的资源文件,而不是类。因此,如果各种应用程序市场中的任何一个正在剥离非类信息(例如,unjar然后重新jar),ZoneInfoMap将成为候选者。同样,如果任何类加载器实用程序存在问题,为了安全性或愚蠢,使用非类资源,ZoneInfoMap将成为候选者。

另一个角度:有问题的运行时环境是否可以在类路径的早期拥有自己的joda-time jar,缺少/ data / segment?

底线:似乎这是Android的狂野西部的另一个例子,我已经学会忽略,直到找到一个复制品。

答案 2 :(得分:0)

我遇到了同样的问题,经过大量搜索谷歌搜索后,我发现了它。 ZoneInfoMap文件是通过运行jodaTime(ZoneInfoCompiler)并使用参数:

创建的
    -dst src\org\joda\time\tz\data src\org\joda\time\tz\src\africa 
src\org\joda\time\tz\src\antarctica src\org\joda\time\tz\src\asia 
src\org\joda\time\tz\src\australasia src\org\joda\time\tz\src\backward 
src\org\joda\time\tz\src\etcetera src\org\joda\time\tz\src\europe 
src\org\joda\time\tz\src\northamerica src\org\joda\time\tz\src\pacificnew 
src\org\joda\time\tz\src\southamerica src\org\joda\time\tz\src\systemv

这会将所有时区添加到jodaTimer,你可以创建更多时区区域我相信如果你也知道如何,如果你不需要所有这些区域,你不必包括所有这些区域。< / p>

为什么它与该错误崩溃是因为它正在寻找不存在的文件。不确定为什么try catch不起作用,但我怀疑它与jodaTimer是一个JAR库(至少是我的)这个事实有关?

不确定这是否意味着要完成,或者是否有更好的解决方案,但这就是我所做的,现在它完全适合我。

有助于得出这个结论的参考文献: http://joda-interest.219941.n2.nabble.com/How-to-run-Joda-time-s-test-Resource-Not-Found-exception-td5913668.html http://sourceforge.net/p/joda-time/discussion/337835/thread/2798a578/

我希望这会有所帮助。