接口传过来一个字符串 id,入库字段是 bigint,代码里图省事写了 long id = (long) request.get(id),编译直接报错 inconvertible types。String 和 long 之间没有继承关系,强转走不通。Java 里正确的写法是 Long.parseLong(str),返回基本类型 long;需要对象类型就用 Long.valueOf(str),内部也是调 parseLong,区别是能直接放进集合。new Long(str) 这种写法在较新的 JDK 里已经废弃,新代码别再用了。
空值和格式错误怎么处理
parseLong 遇到 null 会抛 NullPointerException,遇到空串、带空格、带千分位逗号的字符串会抛 NumberFormatException。日志里看到 For input string 基本都是这种。稳妥写法是先判空和 trim,再包一层 try/catch,出错时给出明确提示,别让异常直接冒到接口层。
如果项目里有 Apache Commons Lang,NumberUtils.toLong(str, 0) 可以在解析失败时返回默认值,适合做统计兜底,不适合校验业务 id。
超出范围会怎样
long 的范围是 -9223372036854775808 到 9223372036854775807。字符串里的数字超过这个范围,parseLong 直接抛 NumberFormatException,不会自动截断。订单号、雪花 ID 超过 19 位时,用 BigInteger 或者干脆保持字符串,别硬转。
前端 JavaScript 也有类似问题,Number 最大安全整数是 9007199254740991,19 位的 ID 转成数字会丢精度,所以后端返回长 ID 一般用字符串。
其他语言一句话带过
C++ 用 std::stol,PHP 用 intval 但要留意超出范围,Go 用 strconv.ParseInt 并且要处理 err。共同点是都要面对空值和溢出两个问题。
回到 string转long:别强转,用 parseLong,判空和 try/catch 一个都别省。看似简单的一行,线上报错多半就出在这。