Java не обнаруживает и не вызывает ничего с целочисленным переполнением, отрицательным или положительным, с типами int или long
Типы примитивов int и long вместе с соответствующими им типами классов Int и Long переполняются в положительном или отрицательном направлении в соответствии с арифметикой дополнения до двух. Первое значение после максимального положительного значения является максимальным отрицательным значением. Для целых это Integer.MIN_VALUE. Для длинных это Long.MIN_VALUE. Обратное происходит с отрицательным переполнением. Первое значение после максимального отрицательного значения является максимальным положительным значением. Для целых это Integer.MAX_VALUE. Для длинных это Long.MAX_VALUE.
Со счетчиком, который увеличивается на +1, очень простой способ обнаружить переполнение - это проверить, достигло ли оно значения Integer.MAX_VALUE для типа int или Long.MAX_VALUE для long, и предпринять некоторые изящные действия, такие как запуск с начала от 0. Альтернатива состоит в том, чтобы остановить обработку или приспособить поведение арифметики дополнения до двух, которая переходит к максимальному отрицательному значению и переходит оттуда. Если переполнение действительно является проблемой, потому что вы используете действительно большие целые числа, используйте экземпляр класса BigInteger. Он почти так же эффективен, как int, и, вероятно, намного эффективнее, чем обработка переноса дополнения в вашем собственном коде.