NumberFormatException空字符串报错:Activity启动失败求助
问题根源分析
你遇到的java.lang.NumberFormatException: empty String报错,本质是尝试将空字符串转换成Double类型时触发的异常。结合你的代码来看,问题出在两个关键环节:
- 存储SharedPreferences时,可能
latitude/longitude本身就是空值或无效值,甚至你之前的代码还漏掉了提交存储的关键步骤; - 读取时直接用空字符串作为默认值,不加校验就调用
Double.parseDouble(),必然会抛出异常。
分步解决方案
1. 修复存储逻辑:确保存入有效数据
先看你的第一段代码,存在两个明显问题:一是没做非空校验,二是没调用apply()/commit()提交存储。修改后的代码如下:
switch (message.what) { case 1: Bundle bundle = message.getData(); // 先获取并校验原始数据 String latStr = bundle.getString("latitude"); String lonStr = bundle.getString("longitude"); // 仅当两个值都有效(非空、非空白)时才存储 if (latStr != null && !latStr.trim().isEmpty() && lonStr != null && !lonStr.trim().isEmpty()) { latitude = latStr; longitude = lonStr; // 提交存储(必须调用apply/commit,否则数据不会持久化) SharedPreferences.Editor editor = sh.edit(); editor.putString(SharedPrefManager.RESTAURANT_LAT, latitude); editor.putString(SharedPrefManager.RESTAURANT_LON, longitude); editor.apply(); // 异步提交,推荐用这个;如果需要同步结果用commit() Log.d("ResultRestroSave", "成功存储位置: " + latitude + ", " + longitude); } else { Log.w("ResultRestroSave", "收到无效的经纬度数据"); latitude = null; longitude = null; } break; default: locationAddress = null; latitude = null; longitude = null; } // 显示Toast时处理空值,避免显示null String toastContent = (latitude != null ? latitude : "无纬度") + " " + (longitude != null ? longitude : "无经度"); Toast.makeText(getApplicationContext(), toastContent, Toast.LENGTH_LONG).show(); Log.d("ResultRestrodata", toastContent);
2. 修复读取逻辑:安全解析避免异常
针对报错的第二段代码,我们需要先校验读取到的字符串是否有效,再尝试解析,同时捕获可能的异常:
sh = DriverMapsActivity.this.getSharedPreferences(SharedPrefManager.SHARED_PREF_NAME, MODE_PRIVATE); // 处理纬度解析 String savedLat = sh.getString(SharedPrefManager.RESTAURANT_LAT, null); if (savedLat != null && !savedLat.trim().isEmpty()) { try { res_latitude = Double.parseDouble(savedLat); } catch (NumberFormatException e) { // 解析失败时设置默认值,同时记录日志 res_latitude = 0.0; Log.e("DriverMapsActivity", "纬度格式无效: " + savedLat, e); } } else { // 无存储值时设置默认值 res_latitude = 0.0; } // 处理经度解析(逻辑和纬度一致) String savedLon = sh.getString(SharedPrefManager.RESTAURANT_LON, null); if (savedLon != null && !savedLon.trim().isEmpty()) { try { res_longitude = Double.parseDouble(savedLon); } catch (NumberFormatException e) { res_longitude = 0.0; Log.e("DriverMapsActivity", "经度格式无效: " + savedLon, e); } } else { res_longitude = 0.0; }
额外优化建议
如果你的经纬度是数字类型,建议直接存储为浮点型而非字符串,彻底避免解析问题:
// 存储时(先确保latStr是有效数字字符串) editor.putFloat(SharedPrefManager.RESTAURANT_LAT, Float.parseFloat(latStr)); editor.putFloat(SharedPrefManager.RESTAURANT_LON, Float.parseFloat(lonStr)); // 读取时 res_latitude = sh.getFloat(SharedPrefManager.RESTAURANT_LAT, 0.0f); res_longitude = sh.getFloat(SharedPrefManager.RESTAURANT_LON, 0.0f);
内容的提问来源于stack exchange,提问作者Arish
相关产品推荐
相关产品推荐

