Общие исключения переполнения и переполнения - PullRequest
12 голосов
/ 28 января 2010

Я пытаюсь заполучить переполнение и исключение переполнения в Java, но не смог получить ни одного хорошего учебника. Конкретно я хочу выучить

  1. Чем они отличаются друг от друга?
  2. Каковы подклассы этих исключений?
  3. По какому сценарию их бросают?
  4. С каким из них можно справиться и как?
  5. Какова лучшая практика, связанная с ними?

Подойдет любая ссылка на полезный урок

Ответы [ 3 ]

26 голосов
/ 28 января 2010

Хорошо, OP говорил о желании узнать как о переполнении стека, так и об арифметическом переполнении, а также об их соответствующем переполнении. Здесь идет ....

  1. Арифметическое переполнение происходит, когда число становится слишком большим, чтобы соответствовать его типу значения. Например, int содержит значения от -2 31 до 2 31 -1 включительно. Если ваш номер выходит за эти пределы, происходит переполнение, и число «оборачивается». Это не приводит к генерации исключения в Java.
  2. Арифметическое понижение происходит, когда число с плавающей точкой становится слишком маленьким, чтобы очень хорошо отличить его от нуля (точность числа была усечена). В Java это тоже не вызывает исключений.
  3. Переполнение стека происходит, когда вы вызываете функцию, которая вызывает другую функцию, которая затем вызывает другую, затем другую ... и стек вызовов функции становится слишком глубоким. Вы получите StackOverflowError, когда это произойдет.
  4. В Java не происходит переполнение стека. Предполагается, что его система времени выполнения предотвращает подобные вещи.

Чтобы ответить на другой вопрос ОП (см. Комментарии), когда вы выходите за границы массива, выдается IndexOutOfBoundsException.

6 голосов
/ 28 января 2010

В арифметике 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 в математике целых чисел.

Я только что задал связанный вопрос о полном стиле проекта, способ справиться с этим.

0 голосов
/ 20 ноября 2013

В 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); }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...