2017-06-26 123 views
5

我得到,MissingResourceException异常:找不到捆绑的基本名称sun.util.logging.resources.logging,地方en_US

Caused by java.lang.InternalError: java.util.MissingResourceException: Can't find bundle for base name sun.util.logging.resources.logging, locale en_US 
从火力崩溃报告我的申请

其他细节

Manufacturer: HTC 
Model: HTC 10 
Android API: 24 

这里是堆栈跟踪

java.util.logging.Logger$1.run (Logger.java:1385) 
java.util.logging.Logger$1.run (Logger.java:1379) 
java.security.AccessController.doPrivileged (AccessController.java:41) 
java.util.logging.Logger.findSystemResourceBundle (Logger.java:1378) 
java.util.logging.Logger.findResourceBundle (Logger.java:1425) 
java.util.logging.Logger.setupResourceInfo (Logger.java:1523) 
java.util.logging.Logger.<init> (Logger.java:266) 
java.util.logging.Logger.<init> (Logger.java:261) 
java.util.logging.LogManager$SystemLoggerContext.demandLogger (LogManager.java:734) 
java.util.logging.LogManager.demandSystemLogger (LogManager.java:399) 
java.util.logging.Logger.getPlatformLogger (Logger.java:474) 
java.util.logging.LoggingProxyImpl.getLogger (LoggingProxyImpl.java:41) 
sun.util.logging.LoggingSupport.getLogger (LoggingSupport.java:100) 
sun.util.logging.PlatformLogger$JavaLoggerProxy.<init> (PlatformLogger.java:636) 
sun.util.logging.PlatformLogger$JavaLoggerProxy.<init> (PlatformLogger.java:631) 
sun.util.logging.PlatformLogger.<init> (PlatformLogger.java:246) 
sun.util.logging.PlatformLogger.getLogger (PlatformLogger.java:205) 
java.net.CookieManager.put (CookieManager.java:262) 
okhttp3.JavaNetCookieJar.saveFromResponse (JavaNetCookieJar.java:47) 
okhttp3.internal.http.HttpHeaders.receiveHeaders (HttpHeaders.java:182) 
okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.java:95) 
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92) 
okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:120) 
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92) 
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67) 
okhttp3.RealCall.getResponseWithInterceptorChain (RealCall.java:185) 
okhttp3.RealCall.execute (RealCall.java:69) 

下面是相关记录器代码

private static ResourceBundle findSystemResourceBundle(final Locale var0) { 
     return (ResourceBundle)AccessController.doPrivileged(new PrivilegedAction() { 
      public ResourceBundle run() { 
       try { 
        return ResourceBundle.getBundle("sun.util.logging.resources.logging", var0, ClassLoader.getSystemClassLoader()); 
       } catch (MissingResourceException var2) { 
        throw new InternalError(var2.toString()); 
       } 
      } 
     }); 
    } 

我已经得到了现场en_AU崩溃报告过。

由于崩溃的代码不受我控制,所以如何防止此崩溃?

+3

似乎是这个问题:https://github.com/square/okhttp/issues/3334 – Henry

+0

@ q126y发布你的目录结构? – PN10

+0

你使用proguard吗? –

回答

3

分析:

MissingResourceException异常:无法找到捆绑的基本名称 sun.util.logging.resources.logging,地方en_US

系统生成候选包名称

​​

对于每个候选软件包名称,它会尝试加载资源包:

首先,它尝试使用生成的类名加载类。

如果这样的类可以找到并使用指定的类 加载器加载的,是的分配与ResourceBundle兼容,是从资源包访问 ,并且可以被实例化,那么getBundle创建此类的新 实例,并使用它作为结果资源包。

否则,getBundle将尝试使用生成的属性文件名查找属性资源文件。

它通过替换所有“。”来从候选包名称生成路径名称 。字符 “/”并附加字符串“.properties”。它尝试使用 java.lang.ClassLoader.getResource(java.lang.String)以此名称查找 “资源”。 (请注意,getResource意义上的 “资源”与资源包的内容无关,它只是一个数据容器,例如 文件。)如果它找到“资源”,它尝试从其内容创建新的 PropertyResourceBundle实例。如果成功,这个 实例将成为结果资源包。

查看更多详细信息here如何解决资源问题。

由于系统正在以类别路径查找任何这些文件的降序(通常不存在_en *。属性)

sun/util/logging/resources/logging_en_US.properties 
sun/util/logging/resources/logging_en.properties 
sun/util/logging/resources/logging.properties 

这将是一个解决方法,以如上述这样的file(或类)添加到你的应用程式。 属性文件的内容看起来像this

# Localizations for Level names. For the US locale 
# these are the same as the non-localized level name. 

# The following ALL CAPS words should be translated. 
ALL=All 
# The following ALL CAPS words should be translated. 
SEVERE=Severe 
# The following ALL CAPS words should be translated. 
WARNING=Warning 
# The following ALL CAPS words should be translated. 
INFO=Info 
# The following ALL CAPS words should be translated. 
CONFIG= Config 
# The following ALL CAPS words should be translated. 
FINE=Fine 
# The following ALL CAPS words should be translated. 
FINER=Finer 
# The following ALL CAPS words should be translated. 
FINEST=Finest 
# The following ALL CAPS words should be translated. 
OFF=Off 
+0

我会给它一个镜头。但是崩溃只发生在HTC设备和API 24上。所以资源包可用于其他API和设备组合。 – q126y

+0

我认为资源包通常是android的一部分。 这只是一种解决方法。我认为在这个设备上出于某种原因,classpath已经损坏,或者他们忘记添加资源或者阻止访问jar。 – Arigion

+0

嘿,我在哪里添加这个文件?我应该将它添加到'assets'文件夹中吗? – q126y

3

如果一切正常的资源文件由其他答案的建议是一个更好的选择,但如果不挑锅我有另一种选择。假设你不需要,你应该能够禁用它这样的记录:

try { 
    Class<?> cls = Class.forName("sun.util.logging.PlatformLogger"); 
    Field field = cls.getDeclaredField("loggingEnabled"); 
    field.setAccessible(true); 
    field.set(null, Boolean.FALSE); 
} catch(Exception e) { 
    // Failed 
} 

如果你这样做月初PlatformLogger应当构建一个DefaultLoggerProxy代替JavaLoggerProxy,所以断码从来没有运行。这很丑陋,因为它取决于内部实现细节,因为它禁用了日志记录,但是它可能适用于您的应用程序?

相关问题