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
进行正确的翻译。