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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Exception VS. IF 
:(
    Опции темы
Samotnik
Дата 13.7.2007, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Добрый день!!
Значицца интересует такая вещь
Допустим код
Код

class Qwer  {
    public static void main(String args[]) {
        try
        {
            int x=14;
            int y=0;
            int z;
            z=x/y;
            System.out.println("Result is" + z);
            }
        catch(Exception e)
        {System.out.println("Warning division by zero"+e);} 
        
    }
}

и 
Код

class Qwer  {
    public static void main(String args[]) {
        
            int x=14;
            int y=0;
            int z;
            if(y==0)
            {System.out.println("Warning division by zero");}
            else
            {z=x/y;
            System.out.println("Result is" + z);}
            
        
    }
}

Вот.
Уважаемые Знатоки, внимание вопрос... 
Какая разница, в том, что использовать: Мощный механизм исключительных ситуаций, или обычная проверка If-ом ???
Т.е. хотелось бы узнать, в чем преимущество исключений? Почему они так важны в Java, ведь если бы можно было обычным условием обойтись, вряд ли П.Ноутон и Ко  придумывали механизм Exception

PM MAIL   Вверх
nornad
Дата 13.7.2007, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Обойтись обычным условием можно далеко не всегда. Одно дело - определить оишбку (исключительную ситуацию) и совсем другое - обработать её. В твоём примере определение и обработка находятся в одном и том же месте, что позволяет использовать вместо исключений обычный оператор условия.

А теперь возьмём такую ситуацию: есть некий класс А, который выполняет некоторые действия на основе переданных ему значений. Причём, значения не обязательно приходят только корректные. Далее, есть класс Б, который пинает класс А с некоторым набором данных, которые ему надо обработать и получить на выходе некоторое значение (ну, скажем, у нас в классе А происходит расчёт некоторой функции и в процессе расчёта вполне возможно то же деление на нуль). Так вот, если ты в классе А используешь оператор условия с выдачей на консоль некоторого сообщения, то что делать классу Б? Что он получит в ответ на вызов? Некое "пустое" значение нереально - функция может давать результат от минус бесконечности до плюс бесконечности. Некий статус? А куда его пристроить по-нормальному (чтобы код кривым не был и легко было изменить его в будущем)? Просто завершать программу? А что скажет тебе на это пользователь? smile 

Всех этих проблем можно избежать, если использовать исключения. Причём, если тебе надо для вывода указать, скажем, строку, на которой это дело упало, ты смело можешь в классе А отловить падение и бросить дальше эксепшн, который кроме пойманного исключения содержит ещё приделанное тобой сообщение о строке, где вывалилось исключение (хотя, в принципе, стектрейс и так содержит всю информацию, но ты можешь пожелать как-то её "улучшить" или просто добавить некоторые свои "заметки").

Надеюсь, теперь стало понятнее, зачем нужны исключения?

Кстати, при использовании исключений и код становится нагляднее.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
LSD
Дата 13.7.2007, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Исключения надо использовать в исключительных ситуациях smile

В твоем примере исключения совсем не к месту. Исключения вообще говоря не предназначены для использования внутри методов. Они предназначены для аварийного завершения метода и индикации вызвавшему коду, если произошла исключительная ситуация. А проверки, по возможности, надо делать if-ом.

Вообще исключения очень ресурсоемки, гораздо более ресурсоемки чем if.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Samotnik
Дата 13.7.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Цитата(LSD @  13.7.2007,  12:13 Найти цитируемый пост)
 Исключения вообще говоря не предназначены для использования внутри методов

 smile 
Т.е. как это? Пролистал, книгу, всю тему Exception ,так там во всех примерах исключения внутри метода описаны. 
Цитата(nornad @  13.7.2007,  03:43 Найти цитируемый пост)
Надеюсь, теперь стало понятнее, зачем нужны исключения?

Если честно, то не совсем, smile  Ведь условием можно проверить не только легкие, но и сложные ситуации. И механизм Исключений не потребуется.
Пэ.Эс.
Просто мой знакомый ходил на собеседование, его спросили "Что такое исключения", он ответил.. Далее последовал вопрос: "Так а зачем они нужны, ведь и обычным условием, всегда можно проверить: деление на ноль, существует ли файл(перед записью), верна ли индексация массива, и т.д." Интересно, что бы вы ответили на данный вопрос  smile  ?
PM MAIL   Вверх
fixxer
Дата 13.7.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 27



Предположим что у тебя есть метод какого-то класса и, предположим, там осуществляется деление на число, передаваемое в качестве параметра. Возможна ситуация деления на ноль? Да, безусловно. Можешь ты ее выкупить? Да, либо поймав исключение, либо сделав банальную проверку. Хорошо, что дальше? Можешь ты в этом методе грамотно утилизировать ситуацию? Нет, максимум что ты сможешь это нагадить в лог и/или застрелиться. Что делать? Ты можешь выбросить свое checked исключение, которое обяжет вызывающий код (у которого вообще-то больше пространства для маневра, потому как откуда-то он это число взял и теоретически знает о нем больше) как-то прореагировать на ситуацию, может попросить пользователя переввести, может еще что-то, а может и прокинуть выше. Таким образом выбрасывая исключение ты можешь быть уверен, что вызывающий код будет вынужден на каком-либо уровне взять на себя ответственность, как-то обработать исключительную ситуацию и она не будет проглочена.


--------------------
user posted image
PM MAIL ICQ   Вверх
Maksym
Дата 13.7.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Цитата(Samotnik @  13.7.2007,  13:45 Найти цитируемый пост)
Так а зачем они нужны, ведь и обычным условием, всегда можно проверить: деление на ноль, существует ли файл(перед записью), верна ли индексация массива, и т.д.

Проверить можно, а что дальше делать? Код, который читает файл, как правило не знает что делать если файл не найден (если, конечно, он спроектирован по уму) , соответственно обработку такой ситуации нужно поручить вызывающему коду, который это может знать, а если не знает, то отдает своему вызывающему коду и т.д. Вот это и есть механизм исключений, передавать исключительную ситуацию выше и выше, пока не найдется кто-то кто знает, что с ней делать.
Цитата(fixxer @  13.7.2007,  14:26 Найти цитируемый пост)
Таким образом выбрасывая исключение ты можешь быть уверен, что вызывающий код будет вынужден на каком-либо уровне взять на себя ответственность, как-то обработать исключительную ситуацию и она не будет проглочена. 

Хорошо сказано.
PM MAIL   Вверх
nornad
Дата 13.7.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(Samotnik @  13.7.2007,  16:45 Найти цитируемый пост)
Ведь условием можно проверить не только легкие, но и сложные ситуации. И механизм Исключений не потребуется.

Продолжаем. Проверить можно. А как обработать такую ситуацию там, откуда вызвали метод? Изобретать всяческие страшные коды возврата - не самый лучший способ, если только метод итак не возвращает код возврата (хорошо ли завершилось его выполнение). Вот для передачи информации об исключительной ситуации на один из вызвавших уровней и используют исключения - как тебе и объясняют, код выше "больше знает" и ему проще решить, что делать в такой ситуации.

Пример:
Программа должна загрузить настройки из файла. Вызывается метод загрузки настроек. Файла физически нет. Что делает метод загрузки? Выбрасывает исключение. Вызвавший его код (например, некий инициализатор) ловит исключение и решает, что делать. Можно, например, тихо записать сие событие в лог и применить некие дефолтные настройки. А можно и ругнуться сообщением пользователю (если этот файл просто обязан быть, а его нет и без него никуда).

Это сообщение отредактировал(а) nornad - 13.7.2007, 18:06


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
niasilil
Дата 13.7.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 9



Цитата(Samotnik @ 13.7.2007,  13:45)
"Так а зачем они нужны, ведь и обычным условием, всегда можно проверить: деление на ноль, существует ли файл(перед записью), верна ли индексация массива, и т.д." Интересно, что бы вы ответили на данный вопрос  smile  ?

Вот смотри. Я дал тебе 5 рублей и послал купить водки. Ты пошёл, проверил сколько денег - их не хватает. У тебя два пути либо ничего не делать (не есть хорошо, так как  все таки жду что ты купишь, слюни глотаю), либо сообщить мне о том что нифига ты не купил. Можно ли сообщить без иключений? Конечно, например, можно возвращать boolean.  В простых ситуациях когда ошибка может быть всего одна, это можно сделать. Раньше так и делали. А вот если неcтандартных, ситуаций не преусмотренных логикой прграммы, несколько, то уже boolean не подойдет. То есть придется уже возвращать int и описывать что -1 это файл не найден, 0 это деление на ноль, 1 это .... Еще прими во внимание тот факт, что кроме этого int ты ещё должен возвратить бутылку водки, все таки. Вобщем, мешанина получается, сильно все усложняет. 
Exceptions очень хорошо упрощают. Можно ли без них обойтись? Можно. Будет сложнее, но обойтись можно. Нужно ли? Категорически нет. 



--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
AntonSaburov
Дата 13.7.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



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

У меня такой подход - если алгоритм предусматривает просто разные действия и оба являются "законными" (ложаться в алгоритм) - то тут несомненно if. И проверки могут входить в этот вариант.
Если же алгоритм заходит в тупик и продолжать его нет смысла, то кидать исключение.

А вот уже вид исключения может быть разный. Это может быть исключение из-за неверных данных, а может быть ошибка работы - файл недоступен или сеть отвалилась, или база упала.
Исключение отдается на откуп тому, кто пытался выполнить команду. Пусть он решает, что надо делать. Недаром типов исключений много 0- для каждого свое решение.
PM MAIL WWW ICQ   Вверх
Samotnik
Дата 14.7.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



2 all
Спасибо, терь все понятно. В принципе я все это читал, но было интересно ВАШЕ мнение по этому поводу. Тема вроде бы простая, но со своими заморочками.
 smile  
PM MAIL   Вверх
niasilil
Дата 14.7.2007, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 9



Интересно. Из соседней темы зашел по ссылке на статьи Joel-а и опять, в который раз, застрял на этом сайте. smile 
Вот такая статья там привлекла мое внимание: 
Exceptions

Цитата

In both Java and C++, my policy is:

   1. Never throw an exception of my own
   2. Always catch any possible exception that might be thrown by a library I'm using on the same line as it is thrown and deal with it immediately.

Необычно. 


--------------------
SCJP 5.0, SCJD
PM MAIL   Вверх
LSD
Дата 14.7.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Samotnik @  13.7.2007,  14:45 Найти цитируемый пост)
Т.е. как это? Пролистал, книгу, всю тему Exception ,так там во всех примерах исключения внутри метода описаны.

Там был пример, где внутри метода выбрасывается исключени и в этом же методе ловится? smile 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
w1nd
Дата 14.7.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(LSD @  13.7.2007,  12:13 Найти цитируемый пост)
Вообще исключения очень ресурсоемки, гораздо более ресурсоемки чем if.

Только при возникновении и обработке исключительной ситуации, когда спешить уже обычно не нужно.

Это сообщение отредактировал(а) w1nd - 14.7.2007, 12:57


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
goodday1941
Дата 14.7.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 1
Всего: 9



статеек по этой теме не подбросите?.. 
а то у мну тоже постояная морока с эксепшенами... пс.. может проще все можно организовать..
Цитата(LSD @  14.7.2007,  10:42 Найти цитируемый пост)
Там был пример, где внутри метода выбрасывается исключени и в этом же методе ловится?  

тоесть на сколько я понял с твоих слов каждый метод должен быть что то по типу:

Код

private void method(Integer a) throws Exception  (ну или интересующий нас эксапшн) {
// какие то действия.. но никаких блоков try-catch нету
}


а исключение уже обрабатываеться в том месте где метод вызываеться:

Код

try{
method(null);
}catch (Exception e){
e.printStackTrace();
}


типо так правильно делать?


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
LSD
Дата 14.7.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(goodday1941 @  14.7.2007,  18:18 Найти цитируемый пост)
тоесть на сколько я понял с твоих слов каждый метод должен быть что то по типу:
....
типо так правильно делать?

Да try/catch внутри метода могут быть только для обработки ошибок других методов. Для управления выполнением надо использовать условные операторы и циклы.
Допускается поймать чужое исключение, обернуть его в свое и выкинуть свое собственно исключение:
Код
try
{
  method(args);
}
catch(OneException ex)
{
  throw new AnotherException("Some error", ex);
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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