创建Short对象时抛出NumberFormatException:为何无编译期错误?
为什么
new Short("32770")编译通过但运行时抛出NumberFormatException? 这是个很典型的编译期检查和运行期校验的差异问题,我来给你拆解清楚:
1. 编译期只做「静态检查」,不处理动态值
Java编译器在编译阶段只会验证代码的语法正确性、类型匹配性:
- 你调用的
Short(String)构造方法,参数确实是String类型,完全符合方法签名要求,所以编译不会报错。 - 编译器不会去解析字符串的具体内容——毕竟字符串的值可能是运行时才生成的(比如从用户输入、文件读取、变量拼接而来),编译期根本没法提前预知它的数值大小。
2. 运行时才会执行字符串到数值的解析
当代码运行到new Short("32770")时,JVM会触发Short类内部的数值解析逻辑:
- Short类型的合法取值范围是**-32768 ~ 32767**,你传入的"32770"明显超出了这个边界。
- 解析逻辑会严格校验数值是否在合法范围内,如果超出就抛出
NumberFormatException,也就是你看到的报错:Exception in thread "main" java.lang.NumberFormatException: Value out of range. Value:"32770" Radix:10
举个类比好理解
就像你告诉编译器“我要把一个字符串转成Short”,编译器只会确认你给的是字符串类型,至于这个字符串能不能转成合法的Short,它得等你运行的时候实际去尝试才知道——毕竟你也可能写new Short(userInput),编译器总不能提前猜到用户会输入什么吧?
内容的提问来源于stack exchange,提问作者user7013574
相关产品推荐
相关产品推荐

