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

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目录下是否存在目标文件
  • 调用时机不对
    不要在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:03:19