Java 例外InInitializeRerror-静态最终变量

Java 例外InInitializeRerror-静态最终变量,java,android,nullpointerexception,Java,Android,Nullpointerexception,以下代码有时会生成异常InInitializeRerror。 显然,静态变量res是null,尽管它是在初始化之后使用的。 原因可能是什么 public class GameActivity extends Activity { private static final Resources res = App.getAppContext().getResources(); public static final String foo = res.getString(R.strin

以下代码有时会生成
异常InInitializeRerror
。 显然,静态变量
res
null
,尽管它是在初始化之后使用的。 原因可能是什么

public class GameActivity extends Activity {
    private static final Resources res = App.getAppContext().getResources();
    public static final String foo = res.getString(R.string.foo); //NullPointer here
}

public class App extends Application {
    private static Context context;
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }   
    public static Context getAppContext() {
        return context;
    }
}

在应用程序初始化之前,您无法访问资源<代码>静态字段是在带有静态定义的
.dex
文件中生成的,这意味着它们应该是静态的,就像
“foo”
。但您不能在静态初始化中使用资源和应用程序资源

通过此更改您的活动类

public class GameActivity extends Activity {
    private static Resources res;
    public static String foo;

    @Override
    protected void onCreate(@android.support.annotation.Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        res = App.getAppContext().getResources();
        foo = res.getString(R.string.foo);
    }
}
顺便问一下,当您可以直接访问
Activity
类中的
getString
方法时,为什么需要创建Resources对象

你可以这么做

public class GameActivity extends Activity {
    public static String foo;

    @Override
    protected void onCreate(@android.support.annotation.Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        foo = getString(R.string.foo);
    }
}

首先声明变量,然后在onCreate()中获取一个值之后,就错过了onCreate()方法

 public class GameActivity extends Activity {
        Context context;
 private static Resources res;
    public static String foo;

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add_address);
            context = this;
            init();
        }

        private void init() {
            res = App.getAppContext().getResources();
            foo = res.getString(R.string.foo); //NullPointer here
        }

        public class App extends Application {
            private static Context context;

            public void onCreate() {
                super.onCreate();
                context = getApplicationContext();
            }

            public static Context getAppContext() {
                return context;
            }
        }
    }
您可以直接从
string.xml
这样的文件中获取一系列字符串

public class GameActivity extends Activity {
    Context context;
    public String foo;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_address);
        context = this;
        init();
    }

    private void init() {
        foo = getString(R.string.foo);
    }
}

不要使用
res=App.getAppContext().getResources()
只需调用
res=getApplicationContext().getResources()

首先不要将资源值保存在
静态
字段中。这些值需要根据配置更改进行更改。在您的情况下,当用户选择一个新的区域设置时,您需要对
R.string.foo
进行正确的翻译。