java中int是32位有符号整数类型,对应的包装类型提供了常量Integer.MAX_VALUE代表其最大值,Integer.MIN_VALUE代表其最小值,即int表示的整数范围在-2147483648 ~ 2147483647之间,超过这个范围会发生溢出,且不会抛任何异常。
在实际编码过程中,怎样判断int或者Integer是否溢出呢?
一、jdk8中提供的java.lang.Math已经帮我们实现了:
import java.lang.Math;
public class ArithmeticSolution{
public static void main(String[] args){
int x = Integer.MAX_VALUE;
int xResult;
try {
System.out.println("x="+x);
xResult = Math.addExact(x, x);
System.out.println("x+x = " + xResult);
} catch (ArithmeticException aex){
System.out.println("x + x 溢出," + aex.getMessage());
}
//判断int 减法 是否溢出
x = Integer.MIN_VALUE;
try{
System.out.println("x="+x);
xResult = Math.subtractExact(x,1);
System.out.println("x-x = " + xResult);
}catch (ArithmeticException aex){
System.out.println("x - 1 溢出," + aex.getMessage());
}
//判断int 乘法 是否溢出
x = Integer.MAX_VALUE;
try{
System.out.println("x="+x);
xResult = Math.multiplyExact(x,x);
System.out.println("x*x = " + xResult);
}catch (ArithmeticException aex){
System.out.println("x * x 溢出," + aex.getMessage());
}
}
}
打印结果:
查看Math.addExact(x, x)源码:
可以看出,Math中对于溢出的处理办法是直接跑出异常,我们在调用处捕捉异常即可。
二、自行编码判断
import java.lang.Math;
public class ArithmeticSolution{
public static void main(String[] args){
int x = Integer.MAX_VALUE;
if(x > Integer.MAX_VALUE-x || x<Integer.MIN_VALUE-x){
System.out.println("x = " + x);
System.out.println("x + x溢出");
}
//判断int 减法 是否溢出
x = Integer.MIN_VALUE;
if(x > Integer.MAX_VALUE + 1 || x<Integer.MIN_VALUE + 1){
System.out.println("x = " + x);
System.out.println("x - 1溢出");
}
//判断int 乘法 是否溢出
x = Integer.MAX_VALUE;
if(x > Integer.MAX_VALUE / x || x<Integer.MIN_VALUE / x){
System.out.println("x = " + x);
System.out.println("x * x溢出");
}
}
}
打印结果: