Предотвратить переполнение при передаче в метод параметра Integer.MAX_VALUE + 1 (int var) - PullRequest
0 голосов
/ 04 июня 2018

Как я могу предотвратить переполнение int, если я передаю параметр Integer.MAX_VALUE + 1 в method(int var)?

Пример:

public class Hello {

    void test(int var){
        System.out.println(var);
    }

    public static void main(String[] args) {        
        Hello hello = new Hello();
        hello.test(Integer.MAX_VALUE + 1);
    }
}

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы не можете «предотвратить» переполнение.Это очевидно, потому что тип данных int имеет диапазон значений.При добавлении чисел с помощью оператора + результат int + int имеет тип int.

Что вы хотите сделать, это, возможно, предотвратить неожиданные результаты, и в этом случае вы бы хотели знатьчто произошло переполнение.Для этого вы можете использовать:

try {
    Math.addExact(a, b);
} catch(ArithmeticException ex) {
    // If this exception is raised, then you know
    // that an overflow occured, and you can handle it
    // more appropriately.
}

При этом вы можете обрабатывать случай переполнения и не использовать неожиданные значения.Но переполнение все же произошло.Когда ваш тест выполнен по этому методу:

Math.addExact(Integer.MAX_VALUE, 1)

Возникает следующее исключение:

java.lang.ArithmeticException thrown: integer overflow
      at Math.addExact (Math.java:825)

Другой вариант - использовать long, чтобы разрешить большие значения.Для этого вам нужно привести хотя бы одно из значений к long:

(long)Integer.MAX_VALUE + 1

В результате long value 2147483648

0 голосов
/ 04 июня 2018

Вы можете предотвратить целочисленное переполнение / переполнение только при добавлении, установив проверку перед операцией и перейдя к следующему большему примитивному типу данных, если требуется.

public class Hello {

    public static void main(String[] args) {
        Hello hello = new Hello();
        int value = Integer.MAX_VALUE;
        int toAdd = 1;

        if (hello.isSafeAdd(value, toAdd)) {
            hello.test(value + toAdd);
        } else {
            hello.test((long) value + toAdd);
        }
    }

    boolean isSafeAdd(int value, int toAdd) {
        return !(toAdd > 0 ? value > Integer.MAX_VALUE - toAdd : toAdd < Integer.MIN_VALUE - value);
    }

    void test(long var) {
        System.out.println(var);
    }

    void test(int var) {
        System.out.println(var);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...