Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не обрабатывается исключение, генерация исключения 
V
    Опции темы
Pawl
Дата 1.1.2012, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Доброго времени суток (и с Новым Годомsmile)!
Попросил меня товарисч сделать прогу для вычисления корня заданного уравнения методом деления отрезка пополам с пом. рекурсии. Сессия у него! Только не думайте, что я ее сделал вчера или сегодня! smile сделал ее я 2 дня назад, но выбрался на форум с вопросом только сейчас - товарисч о себе напомнил... Ну да не в этом дело! Вот код моей программы:
Код

public class Koren {
    private float root;
    
    public Koren(float a, float b, float e) {
     findRoot(a, b, e);
    }
    
    // функция
    private float f(float x) {
     return x * x - 2;
    }
    //поиск корня
    private void findRoot(float a, float b, float e) {
     float x;
     // если функция не пересекает на отрезке a b ось х, корня нет (он равен NaN)     
     if (f(a) * f(b) >= 0) {
         root = Float.NaN;
         return;
     }
     // делим отрезок пополам и сравниваем значение функции в точке х с точностью
     x = (a + b) / 2;
     // если f(x) больше точности, исследуем новый отрезок, иначе - корень найден
     if (Math.abs(f(x)) >= e) {
            if (f(a) * f(x) > 0) {
                findRoot(x, b, e);
            } else {
                findRoot(a, x, e);
            }
     } else {
         root = x;
     }
    }
    // метод, возвращающий значение корня
    public float getRoot() throws Exception {
        if (root != Float.NaN) {
            return root;            
        }
        
        throw new Exception("No root!");    
    }

    public static void main(String[] args) {
     Koren k = new Koren(2.0f, 3.0f, 0.0001f);      
        try {         
         float r = k.getRoot();
         System.out.println(r);         
        } catch (Exception e) {
         System.out.println(e.getMessage());
        }
    }
}

Как видно, корень тут может быть не числом (NaN), а проблема в следующем: в методе getRoot(), когда корень - не число, выбрасывается Exception, которое, по идее, должно отлавливаться в блоке try catch метода main. Но оно не отлавливается, а на экран вместо него выводится NaN. Конечно, можно выбрасывать исключение сразу в методе findRoot, но мне, если честно, так не хочется. Да и не понятно, почему программа некорректно работает. Если кто доходчиво объяснит, буду благодарен.
Спасибо!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
jk1
Дата 1.1.2012, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



С новым годом.

Сравнение чисел с плавающей точкой на точное равенство - плохая идея в большинстве языков. Тем более когда речь идет о NaN. Вот работающий вариант

Код

    public float getRoot() throws Exception {
        if (!Float.isNaN(root)) {
            return root;            
        }       
        throw new Exception("No root!");    
    }



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Pawl
Дата 1.1.2012, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Отлично, спасибо, jk1!
Да, знание таких вот тонкостей приходит с опытом...


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0943 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.