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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор throw? 
:(
    Опции темы
IUser
Дата 24.9.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 Начал изучать исключения Java. 
 С использованием try  и  catch, разобрался, а вот с оператором throw возникли проблемы.
  В чём преимущество использования throw.
 В книге Ноутона есть такое предложение : До сих пор вы захватывали только исключения, которые выбрасывались исполнительной системой Java. Однако ваша программа может сама выбрасывать исключения используя оператор throw.

 В чем разница между этими двумя исключениями. Приведите небольшие примеры если можно. 
 
PM MAIL   Вверх
shimopus
Дата 24.9.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



разница только в том кто выбрасывает исключения. Оператор throw позволяет выбросить любое исключение в любом месте программы. Используется это очень широко, особенно при написании разных фреймворков.
PM ICQ Skype GTalk   Вверх
IUser
Дата 24.9.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 а разве try  и catch  не позволяют тоже самое?
PM MAIL   Вверх
LuMee
Дата 24.9.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



IUser, try и catch служат для перехвата выброшенных исключений. А выбрасываются они как раз с помощью оператора throw.
Скажем, можно смоделировать такую ситуевину:
Код

// Класс, описывающий некое нужное тебе исключение
public class UserNotFoundException extends Exception
{
    ...
}

// А это, допустим, класс, извлекающий данные о пользователях из БД
public class UserManager
{
    // предположим, что этот метод всегда должен возвращать данные 
    // пользователя, а ситуация, когда юзера с указанным id в БД нет - 
    // исключительная
    public User getUserById(int id) throws UserNotFoundException
    {
        User user = ... // как-то ищем его в БД
        if (user == null)
        {
            throw new UserNotFoundException();
        }
    }
}

// Ну и далее этот метод где-то будет вызываться
...
User user = null;
UserManager userManager = new UserManager();
...
try
{
    user = userManager.getUserById(id);
}
catch(UserNotFoundException ex)
{
    System.out.println("По какой-то загадочной причине юзера в БД не оказалось");
}
catch(Exception ex)
{
    System.out.println("А вот тут вообще что-то необъяснимое произошло");
}

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


Нелетучий Мыш
****


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

Репутация: 24
Всего: 151



Цитата(IUser @  24.9.2007,  11:38 Найти цитируемый пост)
 В чем разница между этими двумя исключениями.

Разницы между исключениями - никакой. Разница только в том, что в одном случае ты получаешь это исключение от одного из классов JDK, а в другом - выбрасываешь его в любом месте своего кода. 
Цитата(IUser @  24.9.2007,  11:51 Найти цитируемый пост)
 а разве try  и catch  не позволяют тоже самое? 

Блок try ... catch обрамляет вызов методов и обрабатывает исключение, но не выбрасывает его. Для этого и нужен throw.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Samotnik
Дата 24.9.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


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

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



Цитата

Оператор throw используется для возбуждения исключения «вручную». Для того, чтобы сделать это, нужно иметь объект подкласса класса Throwable, который можно либо получить как параметр оператора catch, либо создать с помощью оператора new. Ниже приведена общая форма оператора throw. 

Код

throw ОбъектТипаThrowable; 


При достижении этого оператора нормальное выполнение кода немедленно прекращается, так что следующий за ним оператор не выполня­ется. Ближайший окружающий блок try проверяется на наличие соответствующего возбужденному исключению обработчика catch. Если такой отыщется, управление передается ему. Если нет, проверяется следующий из вложенных операторов try, и так до тех пор пока либо не будет найден подходящий раздел catch, либо обработчик исключений исполняющей системы Java не остановит программу, выведя при этом состояние стека вызовов. Ниже приведен пример, в котором сначала создается объект-исключение, затем оператор throw возбуждает исключительную ситуацию, после чего то же исключение возбуждается повторно — на этот раз уже кодом перехватившего его в первый раз раздела catch.

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

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

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


 




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


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

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