выгода попытки для деления на нуль

Мой вопрос о блоках try-catch на простом примере деления на нуль. Вы видите первую строку попытки? Если я бросил какую-либо из тех двух переменных к двойному, программа не распознает блок выгоды. По-моему, ли я бросил или не, то только блок выгоды должен быть выполнен. Что не так на этом коде?

public static void main(String[] args) {

    int pay=8,payda=0;  

    try {

        double result=pay/(double)payda; // if I cast any of the two variables, program does not recognize the catch block, why is it so?
        System.out.println(result);
        System.out.println("inside-try");

    } catch (Exception e) {

        System.out.println("division by zero exception");
        System.out.println("inside-catch");

    }
}
14
задан Cœur 12 June 2018 в 13:39
поделиться

7 ответов

Деление на ноль допустимо для чисел с плавающей точки.

  • 1/0 дает Бесконечность.
  • (-1 )/0 дает -Infinity.
  • 0/0 дает NaN.

Эти «числа» правильно определены в IEEE 754.

Целочисленное деление на ноль, с другой стороны, выбрасывается, потому что нельзя представить бесконечность как int .

-121--2623152-

Ответ лежит в собственном выводе программы - она печатает «Бесконечность» для результата . Это происходит потому, что Java запрещает только целочисленное деление на ноль - плавающее деление точки на ноль является законным и приводит к бесконечности .

См. документацию Double и Float для констант POSITIVE _ INFINITY и NEGATIVE _ INFINITY .

-121--2623155-

Я бы предложил проверить:

if (divisor != 0) {
    // calculate
}

, а не ловить исключение

14
ответ дан 1 December 2019 в 06:15
поделиться

Обращались ли вы к mx.utils.ColorUtil и методам adjustBrightness?

-121--4126550-

Я полагаю, что решение может быть использовать что-то подобное:

$str = "Hello, My Name is Tom";
$newStr = '';
$length = strlen($str);
for ($i=0 ; $i<$length ; $i++) {
    if ($str[$i] >= 'A' && $str[$i] <= 'Z') {
        $newStr .= strtolower($str[$i]);
    } else if ($str[$i] >= 'a' && $str[$i] <= 'z') {
        $newStr .= strtoupper($str[$i]);
    } else {
        $newStr .= $str[$i];
    }
}
echo $newStr;

Что дает вам:

hELLO, mY nAME IS tOM


т. е. вы:

  • закольцовываете каждый символ исходной последовательности
  • , если он находится между A и Z, вы помещаете его в нижний регистр
  • , если он находится между a и z, вы помещаете его в верхний регистр
  • , в противном случае, вы сохраняете его как есть

Проблема в том, что это, вероятно, не будет хорошо работать со специальными символами, как акценты:- (


И вот быстрое предложение, которое может (или не может) работать для некоторых других символов:

$str = "Hello, My Name is Tom";
$newStr = '';
$length = strlen($str);
for ($i=0 ; $i<$length ; $i++) {
    if (strtoupper($str[$i]) == $str[$i]) {
        // Putting to upper case doesn't change the character
        // => it's already in upper case => must be put to lower case
        $newStr .= strtolower($str[$i]);
    } else {
        // Putting to upper changes the character
        // => it's in lower case => must be transformed to upper case
        $newStr .= strtoupper($str[$i]);
    }
}
echo $newStr;

Теперь идея заключается в использовании mb _ strtolower и mb _ strtoupper : это может помочь со специальными символами и многобайтовыми кодировками...

-121--3026891-

Никто не должен пытаться ожидать, что Исключение времени выполнения будет передано из кода. Эти исключения можно (и должны быть) легко избежать.

0
ответ дан 1 December 2019 в 06:15
поделиться

Только деление на ноль с целыми числами вызовет исключение ArithmeticException. Деление на ноль с помощью double или float приведет к Infinity .

2
ответ дан 1 December 2019 в 06:15
поделиться

Деление на ноль допустимо для чисел плавающего пункта.

  • 1/0 дает Бесконечность.
  • (-1 )/0 дает -Infinity.
  • 0/0 дает NaN.

Эти «числа» правильно определены в IEEE 754.

Целочисленное деление на ноль, с другой стороны, выбрасывается, потому что нельзя представить бесконечность как int .

-121--2623152-

Ответ лежит в собственном выводе программы - она печатает «Бесконечность» для результата . Это происходит потому, что Java запрещает только целочисленное деление на ноль - плавающее деление точки на ноль является законным и приводит к бесконечности .

См. документацию Double и Float для констант POSITIVE _ INFINITY и NEGATIVE _ INFINITY .

-121--2623155-

Поскольку деление двух двойников возвращает бесконечность, но не бросает. Для проверки можно использовать isInfinite () . Однако соответствующим решением (как уже отмечалось) является проверка знаменателя перед разделением.

1
ответ дан 1 December 2019 в 06:15
поделиться

Это работает хорошо для меня. Вы пробовали точный код?

-121--4103890-

Может быть, проблема как-то вызвана функцией приятно в libc. Это похоже на попытку назвать ваш класс printf .

-121--4103887-

Поскольку вы самопровозглашенный «новичок», я думаю, что было бы неплохо указать на некоторые более широкие проблемы с вашим кодом. (Я знаю, что это не производственный код, а просто предположим ради аргумента, что это было.)

  • Если ожидается исключение, это обычно проще, понятнее и эффективнее, если вы обнаружите условие, которое вызовет исключение. В этом случае, если вы ожидаете, что делитель будет иногда равен нулю, лучше проверить его, прежде чем делать деление.

  • С другой стороны, если исключение является совершенно неожиданным (т.е. «ошибкой»), лучшая стратегия состоит в том, чтобы разрешить распространению исключения на самый внешний уровень. На этом пункте ваш прикладной catch должен поймать все исключения, зарегистрировать stacktrace исключения и выручить.

  • Помимо предыдущего маркера, ошибочно ловить Исключение , Исключение времени выполнения , Изменяемое или Ошибка . Это позволит уловить большое количество исключений, которые вы, вероятно, не намерены уловить. В этом случае, поскольку ожидается ArithmeticException , следует перехватить именно это.

  • В финансовых приложениях редко бывает корректно использовать float или double . Эти типы не являются точными, но финансовые приложения, как правило, требуют, чтобы количество денег обрабатывалось точно.

  • В более общем смысле, плавающие точки числа по своей сути трудно понять непрофессионалам (и новичкам). Многие из «истин,» которые люди хотят держать, на самом деле не держат. Например, вычисление плавающего пункта 1,0/3,0 + 1,0/3,0 + 1,0/3,0 не дает 1,0 . Аналогично (как вы обнаружили) деление на ноль ведет себя по-разному. Если вы хотите использовать плавающую точку безопасно, вам нужно понять подводные камни.

ИЗМЕНИТЬ , разрабатывая первый пункт в ответ на комментарий @ Jay.

Во-первых, я сознательно использовал слово «обычно». Бывают случаи, когда избежать броска ожидаемого исключения ничего не достигает.

Сказав это, вы часто не хотите, чтобы общее «ожидаемое» исключение произошло , даже если ваше приложение не может справиться с ситуацией немедленно . Например, если код OP был частью чего-то большего, может быть лучше явно выдать IllegalArgumentException (если это нарушение контракта API) или какой-то проверенный UserAlbRubbishException , если мы знаем, что это результат неправильного ввода данных пользователем (и есть возможность сообщить/исправить это).

Тот факт, что мы «ожидаем» исключения, означает по определению , что мы знаем о нем больше, чем (скажем) родовое арифметическое исключение .Если мы разрешаем распространение общего исключения, это усложняет для блока catch многие кадры стека действовать соответствующим образом. В этом случае, например, блок удаленного захвата не может диагностировать причину деления на ноль с какой-либо определенностью. ArithmeticException может исходить из другой части приложения, и не может быть даже делением на ноль! Способ устранения заключается в явном создании более конкретного исключения.

8
ответ дан 1 December 2019 в 06:15
поделиться

Деление на ноль допустимо для чисел с плавающей запятой.

  • 1/0 дает бесконечность.
  • (- 1) / 0 дает -Infinity.
  • 0/0 дает NaN.

Эти «числа» правильно определены в IEEE 754.

Целочисленное деление на ноль, с другой стороны, вызывает ошибку, потому что нельзя представить бесконечность как int .

23
ответ дан 1 December 2019 в 06:15
поделиться

Ответ кроется в собственном выводе вашей программы - она ​​печатает «Бесконечность» для результата . Это связано с тем, что Java запрещает только целочисленное деление на ноль - деление с плавающей запятой на ноль является допустимым и дает Infinity .

См. Документацию Double и Float для констант POSITIVE_INFINITY и NEGATIVE_INFINITY .

3
ответ дан 1 December 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: