Общие исключения при переполнении и переполнении

Я пытаюсь получить исключения из переполнения и переполнения в 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); }
}