为何Math.incrementExact未按API文档抛出溢出异常?
为什么Math.incrementExact没有抛出异常?
这事儿得拆成两步看,你写的代码里藏了个容易忽略的细节:
第一步:参数先发生了静默溢出
2_147_483_647是int类型的最大值(也就是Integer.MAX_VALUE),当你计算2_147_483_647 + 1的时候,这是两个int值的加法运算。Java里整数类型(byte/short/int/long)的常规算术运算都是静默溢出的——溢出后不会抛异常,而是按照二进制补码的规则循环取值。所以这个加法的结果其实是-2147483648(也就是Integer.MIN_VALUE),而不是你以为的超出int范围的数。第二步:incrementExact的操作并没有溢出
当你把-2147483648传给Math.incrementExact()时,这个方法做的是给参数加1,得到-2147483647。这个值完全在int的合法范围内(int的范围是-2147483648到2147483647),所以自然不会触发溢出异常,直接返回这个结果。
如果想触发incrementExact的溢出异常,你应该直接传2_147_483_647,也就是写:
System.out.println(Math.incrementExact(2_147_483_647));
这时候方法内部给最大值加1,才会超出int范围,抛出ArithmeticException。
内容的提问来源于stack exchange,提问作者matua
相关产品推荐
相关产品推荐

