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

如何修复无网络访问场景下Android应用发生崩溃的问题

问题根因
  • 你的GET方法在网络请求失败(比如无网络、请求超时、服务端错误)时会返回null,而你在MainActivity.java第70行的prepareData方法中,直接对GET方法的返回值做了数组类操作(比如调用split()、按下标取字符/元素等),没有提前做空值判断,触发空指针崩溃。
  • 潜在问题:你当前是在主线程(Activity的onCreate生命周期)直接执行网络请求,Android 4.0及以上系统默认禁止主线程网络操作,部分真机未做兼容逻辑,也会导致请求失败返回null。
修复方案

1. 对GET方法返回值强制判空

在调用GET方法拿到结果后,先判断是否为null/空字符串,再执行后续逻辑,示例代码:

String requestResult = GET("你的请求地址");
if (requestResult == null || requestResult.isEmpty()) {
    // 处理无网络/请求失败逻辑,比如弹Toast提示用户检查网络,不要执行后续数组操作
    Toast.makeText(this, "网络请求失败,请检查网络连接", Toast.LENGTH_SHORT).show();
    return;
}
// 再执行后续的解析、数组操作逻辑

2. 优化GET方法,避免返回null

修改GET方法,异常时返回空字符串而非null,从源头减少空指针风险:

public static String GET(String url) {
    StringBuilder result = new StringBuilder();
    HttpURLConnection.setFollowRedirects(true);
    try {
        URL request_url = new URL(url);
        HttpURLConnection http_conn = (HttpURLConnection) request_url.openConnection();

        http_conn.setConnectTimeout(100000);
        http_conn.setReadTimeout(100000);
        http_conn.setInstanceFollowRedirects(true);
        http_conn.setRequestMethod("GET");
        http_conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(http_conn.getInputStream()))) {
            for (String line; (line = reader.readLine()) != null; ) {
                result.append(line);
            }
        }

        return result.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }
    // 这里返回空字符串而非null
    return "";
}

3. 把网络请求放到子线程执行

不要在主线程直接调用GET方法,避免主线程阻塞甚至系统直接杀死请求,可选用Thread、AsyncTask或者成熟的开源网络框架处理异步请求。

4. 提前检查网络状态

执行请求前先判断当前设备是否有可用网络,无网络时直接提示用户,不发起无效请求:

// 检查网络是否可用的工具方法
private boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager == null) return false;
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isConnected();
}

// 调用请求前先判断
if (!isNetworkAvailable(this)) {
    Toast.makeText(this, "当前无可用网络,请检查连接", Toast.LENGTH_SHORT).show();
    return;
}
// 再发起网络请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:36:03