You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:45:32