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

NumberFormatException空字符串报错:Activity启动失败求助

问题根源分析

你遇到的java.lang.NumberFormatException: empty String报错,本质是尝试将空字符串转换成Double类型时触发的异常。结合你的代码来看,问题出在两个关键环节:

  1. 存储SharedPreferences时,可能latitude/longitude本身就是空值或无效值,甚至你之前的代码还漏掉了提交存储的关键步骤;
  2. 读取时直接用空字符串作为默认值,不加校验就调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:38:54