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

Android开发使用TinyDB存储城市列表触发NullPointerException空指针报错如何解决

问题根因
  • 你在代码中声明了全局Context类型变量context,但从未给该变量赋值,初始化TinyDB时传入的是null值。TinyDB内部需要依赖Context实例获取SharedPreferences存储对象,传入空Context直接触发了空指针异常。
  • 还存在一个潜在隐患:首次启动应用未存入任何城市时,调用tinydb.getListString("Cities")会返回空集合,直接调用add方法也会触发空指针,需要补充非空判断。
修复步骤
  1. 初始化TinyDB时传入有效的Context实例,Activity本身就是Context子类,直接传入this即可,未使用的全局context变量可以直接删除。
  2. 读取存储的城市列表时补充非空校验,如果返回为空就初始化新的ArrayList。

修改后的完整代码如下:

public class MainActivity extends AppCompatActivity {

    private ListView cityListView;
    private CitylistAdapter citylistAdapter;

    private List<City> cities = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 传入当前Activity实例作为有效Context
        TinyDB tinydb = new TinyDB(this);

        if (getIntent().getExtras() != null) {
            String name = getIntent().getStringExtra("City");
            ArrayList<String> cityList = tinydb.getListString("Cities");
            // 非空校验,为空就初始化新列表
            if (cityList == null) {
                cityList = new ArrayList<>();
            }
            if (name != null && !name.isEmpty()) {
                cityList.add(name);
                tinydb.putListString("Cities", cityList);
            }
        }

        ArrayList<String> cityList = tinydb.getListString("Cities");
        if (cityList != null) {
            for (int i = 0; i < cityList.size(); i++) {
                City city = new City();
                city.setName(cityList.get(i));
                cities.add(city);
            }
        }

        this.cityListView = (ListView) findViewById(R.id.cityList);

        this.citylistAdapter = new CitylistAdapter(getApplicationContext(), cities);
        this.cityListView.setAdapter(citylistAdapter);

        FloatingActionButton addCity = (FloatingActionButton) findViewById(R.id.openAddCity);

        addCity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startAddCityActivity();
            }
        });
    }

    private void startAddCityActivity() {
        Intent intent = new Intent(this, AddCityActivity.class);
        startActivity(intent);
    }
}

内容的提问来源于stack exchange,提问作者Louis FELDMAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:15:02