Kotlin从assets读取JSON为字符串时抛出异常的问题咨询
运行时异常排查方案
你写的IO流操作逻辑本身没有语法问题,use扩展函数会自动完成流关闭,不存在资源泄漏问题,运行时抛出异常基本都是以下几类原因,对照排查即可:
- 文件名/路径传参错误
AssetManager识别的是assets目录下的相对路径:- 文件直接放在
src/main/assets根目录时,直接传文件名即可,比如文件是data.json就传"data.json",不要加assets/前缀,也不要用WebView专属的file:///android_asset/路径格式 - 文件放在assets子目录时,要带上子目录路径,比如文件在
src/main/assets/json/data.json,传参为"json/data.json"
- 文件直接放在
- 文件未被正确打包进APK
- 检查assets目录位置是否正确:必须是
src/main/assets,建在其他位置的文件不会被打包进APK - 检查文件名规范:文件名不要用中文、空格、大写字母、特殊符号,否则打包时可能出现文件名异常,导致运行时找不到文件
- 检查模块级
build.gradle的aaptOptions配置,确认没有设置ignoreAssets规则把你的json文件过滤掉 - 最直接的验证方式:把编译出的APK后缀改成zip解压,查看assets目录下是否存在目标文件
- 检查assets目录位置是否正确:必须是
- 调用时机不对
不要在Application.attachBaseContext()阶段调用AssetManager读取文件,此时资源系统还未完成初始化,会抛出异常,至少要等对应组件的onCreate生命周期执行后再调用。 - 字符编码不匹配
你代码里的bufferedReader()没有指定字符集,默认使用UTF-8解码,如果你的json文件是GBK等其他编码保存的,会抛出解码异常,建议明确指定编码:jsonString = context.assets.open(fileName).bufferedReader(Charsets.UTF_8).use { it.readText() } - 上下文使用错误
如果是本地单元测试(test目录下的测试用例),普通mock的Context无法访问APK内的assets资源,必须用androidTest目录下的仪器化测试,传入Instrumentation提供的Context才能正常读取。
注意:你当前的catch逻辑只捕获IOException,如果运行时抛出的是其他类型异常(比如空指针、非法状态异常)不会被捕获,建议先拿到完整异常堆栈,能直接定位90%以上的问题。
内容的提问来源于stack exchange,提问作者FerasAS
相关产品推荐
相关产品推荐

