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

Java调用Google Sheets API读取数据时遇空指针及403权限问题

解决Google Sheets API的NullPointerException和403权限错误

我之前在集成Google Sheets API的时候也踩过这俩坑,刚好能帮你分析清楚问题所在:

一、为什么client_secret.json有数据还出现NullPointerException?

你报错里的java.lang.NullPointerException at java.io.Reader.<init>(Reader.java:78),本质是代码找不到你的client_secret.json文件,导致传入Reader的InputStream是null,直接触发空指针。常见原因有这几个:

  • 文件名/路径不匹配:你提到下载的是client_services.json,但Google Sheets API的常规加载逻辑是找client_secret.json,如果代码里写的是后者,自然找不到文件。另外,加载资源时要注意路径前缀——如果是放在src/main/resources下,必须用带斜杠的绝对路径读取,比如:
    InputStream in = Quickstart.class.getResourceAsStream("/client_secret.json");
    // 如果写成getResourceAsStream("client_secret.json"),会从当前类的包路径下找,肯定找不到
    
  • 资源文件未被正确编译:Maven/Gradle项目中,src/main/resources是默认资源目录,但如果刚放完文件没刷新项目,IDE可能没把它同步到编译目录(比如target/classes)。你可以去编译后的目录看看,有没有这个json文件,如果没有,刷新一下项目(比如IntelliJ里点File -> Reload All Maven Projects)。
  • IDE资源目录配置错误:如果你的项目没把src/main/resources标记为“资源根目录”,IDE会把它当成普通代码目录,不会打包到classpath里。检查一下:右键目录 -> Mark Directory as -> Resources Root。

二、403 Forbidden错误的常见原因

这个错误是Google API明确告诉你“你没有权限访问这个资源”,排查方向主要是这几个:

  • 权限范围(Scope)不对:如果只是读取数据,必须包含https://www.googleapis.com/auth/spreadsheets.readonly(或者更宽的https://www.googleapis.com/auth/spreadsheets)。如果代码里用了错误的scope(比如只加了Drive的scope),就会被拒绝访问。
  • 电子表格未授权给你的账号/服务账号:
    • 如果你用的是服务账号:打开client_secret.json找到client_email字段,把这个邮箱地址添加为目标电子表格的“查看者”或“编辑者”;
    • 如果你用的是个人账户OAuth授权:确保你授权的那个Google账号本身有该表格的访问权限(比如表格是公开共享的,或者已经把账号添加到共享列表)。
  • Credential对象初始化失败:如果授权流程没走通(比如桌面应用第一次运行没弹出授权页面,或者服务器端应用没正确获取刷新令牌),你的Credential是无效的,调用API自然会返回403。可以在代码里加日志,打印Credential的状态,确认是否正确获取到了有效凭证。
  • API未真正启用:去Google Cloud Console的API库,确认Google Sheets API的状态是“已启用”——有时候可能误操作启用了其他API(比如Google Drive API),但没开Sheets API。

快速验证步骤

  1. 先解决空指针:在加载资源的代码前加判断,确认InputStream不为null:
    InputStream in = Quickstart.class.getResourceAsStream("/client_secret.json");
    if (in == null) {
        throw new RuntimeException("找不到client_secret.json,请检查文件路径和名称");
    }
    
  2. 检查Scope:确保代码里的scope列表包含正确的权限:
    List<String> scopes = Arrays.asList(Scopes.SPREADSHEETS_READONLY);
    
  3. 确认表格共享权限:把对应的邮箱(服务账号或个人账户)添加到表格的共享列表里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:18:46