应先trim并判空,再用try-catch捕获numberformatexception并返回默认值或自定义异常;超范围数字改用long.parselong()或biginteger。

字符串转 int 时抛 NumberFormatException 怎么办
直接调用 Integer.parseInt() 最常见也最危险——只要字符串带空格、字母、空值或超出范围,立刻崩。别指望它自动 trim 或兜底。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 先用
String.trim()去首尾空格,再判断是否为空:str == null || str.trim().isEmpty() - 用
try-catch包住Integer.parseInt(),别让它穿透到上层;异常里不要只打日志,至少返回默认值(比如-1或抛自定义异常) - 注意边界:
"2147483648"看似是数字,但超了int最大值2147483647,照样报错;真要处理大数,改用Long.parseLong()或BigInteger
Double.parseDouble() 和 Double.valueOf() 有啥区别
两者都解析字符串为浮点数,但返回类型不同:parseDouble() 返回基本类型 double,valueOf() 返回包装类 Double。多数时候你想要的是基本类型,尤其做计算时。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 避免无谓装箱:如果后续要参与算术运算(比如
+ - * /),优先用Double.parseDouble(),省去隐式拆箱开销 -
valueOf()在字符串为"NaN"、"Infinity"时不会抛异常,而是返回对应特殊值;而parseDouble()对"NaN"是合法的,但对"nan"(小写)仍会报错 - 注意
null输入:两个方法遇到null都抛NullPointerException,必须提前判空
批量转换字符串数组时怎么避免重复 try-catch
循环里每个元素都套一层 try-catch 不仅啰嗦,还掩盖了真正该关注的坏数据位置。不如把解析逻辑抽成带上下文的方法。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 写一个工具方法,例如
safeParseInt(String s, int defaultValue),内部统一处理空、异常、越界,并记录原始索引或内容用于排查 - 别用
Stream.map()直接转:像Arrays.stream(strs).map(Integer::parseInt).toArray()一旦某个元素失败,整个流就中断,没法知道哪条出问题 - 如果数据来自外部(如 CSV、HTTP 请求),建议在解析前加简单校验正则,比如
^-?\d+$初筛整数格式,减少进parseInt的无效调用
Boolean.parseBoolean() 为什么不能当“真/假”翻译器用
它只认 "true"(全小写),其它所有字符串(包括 "True"、"1"、"yes"、"false")一律返回 false。这不是 bug,是设计如此——它只做字面量匹配,不是语义解析。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 别把它当开关配置解析器用。需要支持多种真值写法时,自己写判断:
"1".equals(s) || "true".equalsIgnoreCase(s) || "yes".equalsIgnoreCase(s) - 注意大小写敏感性差异:
Boolean.valueOf()行为和parseBoolean()一致,但返回Boolean对象;两者都不接受null - 如果字段可能为
null或空白,先StringUtils.isBlank()(Apache Commons)或手动判空,再进布尔解析,否则null传入直接 NPE
类型转换看着简单,但每种基本类型的解析逻辑、边界行为、空值策略都不一样。最容易被忽略的是:错误处理方式决定了系统是静默吞掉问题,还是暴露可定位的线索。










