如何修复无网络访问场景下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
相关产品推荐
相关产品推荐

