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

Android中url.openStream()抛出FileNotFoundException问题求助

这种情况我之前也碰到过,HttpURLConnection抛出的FileNotFoundException很多时候并不是真的找不到文件,而是服务器返回了非2xx的HTTP状态码(比如401、403、500等)——它默认只把200左右的响应当成“成功”,其他情况就会抛出这个异常。结合你的情况,我给你几个排查和解决的方向:

1. 先看服务器到底返回了什么状态码和错误信息

这是最关键的一步,直接获取响应状态,再读错误流就能知道服务器拒绝请求的原因:

URL url = new URL(urlReady);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 显式声明请求方法,默认是GET,但避免隐式问题
connection.setRequestMethod("GET");

int responseCode = connection.getResponseCode();
Log.d("UserGetter", "Response Code: " + responseCode);

if (responseCode == HttpURLConnection.HTTP_OK) {
    // 正常处理输入流
    BufferedReader buff = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    // ...你的业务逻辑
} else {
    // 读取错误流,获取服务器的具体错误提示
    BufferedReader errorReader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
    StringBuilder errorMsg = new StringBuilder();
    String line;
    while ((line = errorReader.readLine()) != null) {
        errorMsg.append(line);
    }
    Log.e("UserGetter", "Server Error: " + errorMsg.toString());
}

运行这段代码后,看日志里的状态码和错误信息,就能快速定位问题(比如403可能是权限拦截,401是未授权,500是服务器内部错误)。

2. 检查请求头是否和手动访问一致

很多服务器会校验请求头,比如User-Agent——手动用浏览器访问时,浏览器会自动带上这个头,但原生HttpURLConnection默认可能没有,服务器就会拒绝请求。你可以在代码里加上和浏览器一致的请求头:

connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
// 还可以补充其他常见头,比如Accept
connection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");

3. 检查URL是否存在编码问题

如果你的URL里包含空格、中文或者其他特殊字符,直接用new URL()可能会解析错误,导致请求的地址和你手动访问的不一致。可以用URI来构建正确的URL:

URI uri = new URI(urlReady);
URL url = uri.toURL();

或者单独对URL中的参数部分进行编码:

String encodedParam = URLEncoder.encode("你的参数内容", "UTF-8");
String urlReady = "http://xxx.com/api?param=" + encodedParam;

4. 对比那处正常运行的代码

既然另一处几乎相同的代码能正常工作,就把两边的代码仔细对比:

  • 请求方式是不是一致(GET/POST)?
  • 有没有设置额外的请求头(比如Authorization、Cookie)?
  • URL的构建逻辑有没有差异?
  • 是不是用了不同的网络工具(比如另一处用了OkHttp而不是原生HttpURLConnection)?

5. 其他可能的排查点

  • 检查AndroidManifest.xml里是否添加了网络权限:<uses-permission android:name="android.permission.INTERNET" />(虽然之前能跑,但可能被误删)
  • 检查设备网络环境:是不是切换了WiFi/移动数据,或者当前网络有代理拦截了请求?
  • 确认服务器端变化:比如IP封禁、接口权限调整、域名解析变更?

先从第一步开始排查,获取服务器的错误信息,基本就能快速定位问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:51:46