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

