![](/img/trans.png)
[英]How to detect and prevent integer overflow when multiplying an integer by float in Java?
[英]Java addExact method does not detect Integer Overflow when assigned to a variable
我有以下嘗試塊來檢測 Integer 溢出。
try {
Math.addExact((number % 10) * (int) Math.pow(10, i), reversedNumber);
} catch(ArithmeticException ae) {
return 0;
}
好的,所以如果我按原樣運行上面的代碼,它會按預期導致 ArithmeticException。 但是,如果我想將addExact
的結果分配給 integer 變量,則永遠不會檢測到溢出。
try {
reversedNumber = Math.addExact((number % 10) * (int) Math.pow(10, i), reversedNumber);
} catch(ArithmeticException ae) {
return 0;
}
有人能告訴我為什么在分配給變量時沒有捕獲到異常嗎? 是不是因為賦值過程本身是成功的,所以沒有拋出異常?
public static int reverse(int x) {
int number = Math.abs(x);
if(number == 0) return number;
int numberOfDigits = (int) Math.log10(number) + 1;
int reversedNumber = 0;
for(int i = numberOfDigits - 1; i >= 0; i--) {
try {
reversedNumber = Math.addExact((number % 10) * (int) Math.pow(10, i), reversedNumber);
} catch(ArithmeticException ae) {
return 0;
}
number /= 10;
}
return x < 0 ? -reversedNumber : reversedNumber;
}
輸入 1534236469,答案應該是 0。
這與您是否將其分配給變量無關。 如果您沒有將輸入1534236469分配給reversedNumber
,您的方法會正確返回 0 。 對於 1534236469,無論哪種方式, addExact
都不會引發異常。
加法沒有溢出,這就是addExact
不拋出異常的原因。 但是(number % 10) * (int) Math.pow(10, i)
的乘法溢出了。 在循環的第一次迭代中,您將乘以9 * 1000000
,這超出了int
的范圍。
addExact
僅檢查您傳遞給它的兩個 arguments 相加的溢出。 在對兩個 arguments 本身進行評估期間,它不會檢查溢出。
您需要使用multiplyExact
:
int powerOf10 = (int) Math.pow(10, i);
int digit = (number % 10);
reversedNumber = Math.addExact(Math.multiplyExact(digit, powerOf10), reversedNumber);]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.