在主Activity外读取CSV文件时遇getAssets空对象引用错误求助
问题分析与解决
错误信息'android.content.res.AssetManager android.content.Context.getAssets()' on a null object reference的核心原因是**context对象为空**,调用getAssets()时触发空指针异常。你虽在Team类中定义了Context成员并通过构造方法传入,但问题大概率出在Team对象的实例化环节,导致context未被正确赋值。
常见错误场景及修复方案
实例化Team时未传入有效Context
若在Activity中写成Team team = new Team(null);,或在其他类中传递了空的context,都会引发该问题。
正确做法:在Activity中实例化时,传入当前Activity的上下文:// 在MainActivity的onCreate方法内 Team team = new Team(this);若在Fragment中实例化,使用
requireContext()(避免getActivity()返回null):Team team = new Team(requireContext());使用了已失效的Context
若传递的是Activity的context,但Activity已被销毁(比如在异步任务中使用已销毁的Activity context),也会导致context为空。这种情况建议改用Application Context,其生命周期与应用一致,不会轻易被回收:// 在Activity中获取Application Context Team team = new Team(getApplicationContext());
额外代码优化建议
- 增加空值判断,提前避免崩溃:
public void loadAvenger() throws IOException { if (context == null) { Log.e("Team", "Context为空,无法加载资产文件"); throw new IOException("Context不能为null"); } AssetManager am = context.getAssets(); // 后续代码... } - 关闭IO流,避免资源泄漏:
public void loadAvenger() throws IOException { if (context == null) { Log.e("Team", "Context为空,无法加载资产文件"); throw new IOException("Context不能为null"); } AssetManager am = context.getAssets(); InputStream inStream = null; Scanner scan = null; try { inStream = am.open("data.csv"); scan = new Scanner(inStream); while(scan.hasNext()){ String line = scan.nextLine(); String cont[] = line.split(","); // 确保CSV每行有足够字段,防止数组越界 if (cont.length >= 8) { Avenger temp = new Avenger(cont[0],cont[1],cont[2],cont[3],cont[4],cont[5],cont[6],cont[7]); avengers.add(temp); } else { Log.w("Team", "无效的CSV行:" + line); } } } finally { if (scan != null) scan.close(); if (inStream != null) inStream.close(); } }
内容的提问来源于stack exchange,提问作者ADAL SERNA
相关产品推荐
相关产品推荐

