只有部分用户报告“找不到资源”错误。这有道理吗?

问题描述 投票:0回答:4

我发现我发布的 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 Time Library 没有添加到构建路径或其他什么中),但是为什么几千个用户中只有大约 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 上,因为它应该被捕获。谁能解释一下这个吗?

java android jodatime crittercism
4个回答
80
投票

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

JodaTimeAndroid.init(this);

4
投票

没有崩溃,但在单元测试中,我看到相同的错误消息

java.io.IOException: Resource not found: "org/joda/time/tz/data/ZoneInfoMap"
当使用
joda-time-android
调用 DateTimeFormatter

类时

joda-time java 依赖项添加到测试源集将修复单元测试中的错误

testImplementation "joda-time:joda-time:$latestVersion"


0
投票

我在一个流行的免费应用程序中看到类似的、罕见的报告。到目前为止我还没有复制它。网络上散布着对此问题各种参考,但并非全部都涉及Android。

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

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

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


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,我相信您可以创建更多时区区域,如果您也知道的话,并且如果您不需要所有时区,则不必包含所有时区。

为什么它因该错误而崩溃是因为它正在寻找不存在的文件。不确定为什么 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/(这是一个损坏的链接。这就是为什么我不应该在帖子中包含链接,我现在知道得更好了)

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.