Общие исключения при переполнении и переполнении
Я пытаюсь получить исключения из переполнения и переполнения в java, но не смог получить хороший учебник. В частности, я хочу узнать
- Как они отличаются друг от друга?
- Каковы подклассы этих исключений?
- В каком сценарии они выбрасываются?
- Какое из них можно обрабатывать и как?
- Какова наилучшая практика, связанная с ними?
Любая ссылка на полезный учебник будет делать
Ответы
Ответ 1
Хорошо, OP говорил о желании узнать о переполнении стека и арифметическом переполнении, а также о соответствующем их недополнении. Здесь идет....
- Арифметическое переполнение происходит, когда число становится слишком большим, чтобы соответствовать его типу значений. Например,
int
содержит значения между -2 31 и 2 31 -1 включительно. Если ваш номер превышает эти пределы, происходит переполнение, а число "обертывается". Они не вызывают генерирования исключения в Java.
- Арифметическое недополнение происходит, когда число с плавающей запятой становится слишком маленьким, чтобы отличать очень хорошо от нуля (точность числа усекалась). В Java это также не вызывает исключения.
- Переполнение стека происходит, когда вы вызываете функцию, которая вызывает другую функцию, которая затем вызывает другую, затем другую... и стек вызовов функций становится слишком глубоким. Вы получите
StackOverflowError
, когда это произойдет.
- Недостаток стека не происходит в Java. Предполагается, что его система выполнения предотвратит появление такого рода вещей.
Чтобы ответить на другой вопрос OP (см. комментарии), когда вы переходите границы границ массива, выдается IndexOutOfBoundsException
.
Ответ 2
В Java-арифметике переполнение или нижнее течение будет никогда выдавать исключение. Вместо этого для арифметики с плавающей запятой значение устанавливается как Not a number
, "бесконечно" или ноль.
Чтобы проверить их, вы можете использовать статические методы: isNaN или isInfinite с использованием соответствующих классов-оболочек. Вы можете справиться с этим по мере необходимости. Пример:
double d1 = 100 / 0.;
if (Double.isNaN(d1)) {
throw new RuntimeException("d1 is not a number");
}
if (Double.isInfinite(d1)) {
throw new RuntimeException("d1 is infinite");
}
Для некоторых операций вы можете получить ArithmeticException, например, когда dividing by zero
в математике Integer.
Я просто задал вопрос о полном стиле проекта, чтобы справиться с этим.
Ответ 3
Java не имеет целых без знака. Это позволяет легко выбросить исключение, если вы считаете, что это может быть полезно.
public class Counter
{
private int counter = 0;
public int increment ()
{
counter += 1;
if (counter < 0)
throw new RuntimeException ("Counter overflow");
else
return counter;
}
public String toString() { return String.valueOf(counter); }
}