簡體   English   中英

Java addExact 方法未檢測到 Integer 分配給變量時的溢出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM