Android中Java文件引用strings.xml字符串致应用崩溃的解决
解决Android中从strings.xml获取字符串导致启动崩溃的问题
你遇到的空指针异常,核心原因是成员变量的初始化时机早于Activity的Context创建。在onCreate()方法执行前,Activity还未完成初始化,此时调用getResources()或getString(),依赖的Context对象是空的,必然会触发崩溃。
下面是两种可行的解决方案:
方案1:在onCreate()中初始化变量
这是最直接的处理方式,把字符串的赋值逻辑放到onCreate()方法中——此时Activity的Context已经完全就绪,可以安全调用资源相关方法:
public class MainActivity extends AppCompatActivity { Button button; String passName; // 先声明变量,暂不初始化 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 在这里初始化字符串,Context已可用 passName = getString(R.string.name); button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(),"Moving to second activity...",Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("key", passName); startActivity(intent); } }); } }
方案2:用懒加载Getter方法获取字符串
如果希望保持变量的成员属性形式,可以通过Getter方法在需要的时候才获取字符串,避免提前初始化导致的Context问题:
public class MainActivity extends AppCompatActivity { Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(),"Moving to second activity...",Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, SecondActivity.class); // 调用Getter方法获取字符串 intent.putExtra("key", getPassName()); startActivity(intent); } }); } private String getPassName() { return getString(R.string.name); } }
额外提醒
不需要用new String(getString(R.string.name))包装,getString()本身返回的就是String对象,直接赋值即可,额外包装属于冗余操作。
内容的提问来源于stack exchange,提问作者TheGoldenGear_RR5
相关产品推荐
相关产品推荐

