场景分类 | 典型场景案例 |
---|---|
JSON解析 | 后端返回数字”123″,前端用int 接收,但实际是字符串类型 |
数据库操作 | SQLite查询结果Cursor 中DOUBLE类型字段用getString() 读取 |
Intent传值 | 使用putExtra("key", int) 传递数据,但用getStringExtra("key") 接收 |
泛型擦除 | ArrayList |
单元测试 | Mock对象返回Integer 类型,但测试代码按String 类型处理 |
错误案例1:JSON字段类型不匹配
// 错误代码:将数值型字段当作字符串解析 class DataModel { public int id; } Gson gson = new Gson(); DataModel model = gson.fromJson("{"id":"123a"}", DataModel.class); // 抛出NumberFormatException
解决方案:
String
类型接收错误案例2:数据库类型转换异常
// 错误代码:未正确读取浮点型字段 Cursor cursor = db.rawQuery("SELECT price FROM products", null); double price = cursor.getDouble(cursor.getColumnIndex("price")); // price实际存储为TEXT类型
解决方案:
getType()
判断字段类型防护措施 | 实现方式 |
---|---|
显式类型检查 | 使用instanceof 验证对象类型 |
数据校验 | 对输入数据进行正则表达式校验(如数字格式) |
异常处理 | 包裹NumberFormatException 等异常 |
通用转换工具 | 创建安全转换工具类(见下方示例代码) |
安全转换工具类示例:
public class SafeConverter { public static Integer getInt(Object obj) { if (obj instanceof Integer) return (Integer) obj; if (obj instanceof String) { try { return Integer.parseInt((String) obj); } catch (NumberFormatException e) { return null; } } return null; } // 类似实现getLong(), getDouble()等方法 }
getClass()
和具体值 Log.d("TypeCheck", "value class: " + value.getClass() + ", value: " + value);
Q1:如何安全地将Object类型转换为指定泛型类型?
A:使用Class.cast()
方法结合类型检查:
public <T> T safeCast(Object obj, Class<T> clazz) { if (clazz.isInstance(obj)) { return clazz.cast(obj); } return null; // 或抛出自定义异常 }
Q2:当遇到ClassCastException
时如何快速定位问题?
A:排查步骤: