java.lang.ExceptionInInitializerError原因:android.content.res.Resources $ NotFoundException:字符串资源

问题描述

我有一个consts类:

public class AppConstants {
    public static final class Projects {
        public static final String JOB = Resources.getSystem().getString(R.string.job);
        // more...
    }
}

我想在运行时使用此const:

if (AppConstants.Projects.JOB.equals(curr)) {
   // do stuff
}

但是我得到以下异常:

/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.ExceptionInInitializerError
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x7f1101cc

我应该如何解决?我认为是因为我使用了关键字static。但是我怎么能访问这些字段呢?

解决方法

getSystem()的JavaDoc说:

返回一个全局共享资源对象,该对象仅提供对系统资源(无应用程序资源)的访问,未为当前屏幕进行配置(无法使用尺寸单位,不会根据方向发生变化等),并且不受影响通过运行时资源覆盖。

R.string.job是系统资源还是应用程序资源

JavaDoc还说:

通常,您可以使用Context#getResources()获取与您的应用程序关联的Resources实例。


R.string.job不是系统资源,因此您需要通过Context访问它。然后,您可以致电context.getResources().getString(x)或直接致电context.getString(x)

那你为什么不只使用它呢? (假设您已经处于活动或应用程序之类的上下文中)

if (getString(R.string.job).equals(curr)) {
   // do stuff
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...