Винятки-JAVA ДЛЯ ANDROID

&nbsp

У мові Java виключення використовуються як зручний інструмент, що дозволяє справлятися з незвичайними ситуаціями Найчастіше такі умови зводяться до виникнення помилок

Код, який намагається справити синтаксичний розбір веб-сторінки, не може, наприклад, продовжити роботу, якщо у нього не виходить вважати сторінку з мережі Зрозуміло, можна перевірити результати спроби такого зчитування, і продовжити роботу лише в тому випадку, якщо спроба виявиться вдалою, як показано в наступному прикладі:

Із застосуванням винятків код стає красивішим і надійним:

У цьому варіанті коду кожен метод, що викликається від getPage, використовує виключення для моментального «короткого замикання» всієї подальшої обробки, якщо раптом щось піде неправильно Прийнято говорити, що методи викидають винятку Наприклад, метод getActions може виглядати приблизно так:

При виконанні затвердження throw обробка відразу ж припиняється і починається з наступного блоку перехоплення (catch block) Ось приклад блоку «спроба-перехоплення» (try-catch):

Цей код виконує повторні спроби при відмові мережі Зверніть увагу, що він навіть не знаходиться в методі readPageFromNet, який викинув виняток NetworkException Коли ми говоримо, що обробка поновлюється з найближчого блоку «спроба-перехоплення», ми підходимо до обговорення цікавого способу, яким Java делегує відповідальність за виключення

Якщо відсутній блок «спроба-перехоплення», який оточував б твердження throw всередині методу, через викинутого виключення може здатися, що повернення методу відбувається миттєво Більше ніякі інструкції не виконуються і ніяке значення не повертається Зокрема, в попередньому прикладі жоден фрагмент коду, наступний за спробою отримати сторінку з мережі, не враховує тієї проблеми, що передумова – сторінка була прочитана – не виконано Прийнято говорити, що метод був різко завершено, і в даному випадку управління повертається до getActions Оскільки getActions також не містить блок «спроба-перехоплення», він теж різко завершується Управління передається назад (вгору по стеку) до викликає програмі

У даному випадку при викиді NetworkException управління повертається до першого твердженням всередині блоку перехоплення (catch), наведеного як приклад Це твердження є інструкцією занесення мережевий помилки в журнал Прийнято говорити, що виключення було перехоплено першим твердженням catch, чий аргумент відноситься до того ж типу, що й тип викинутого виключення, або до супертіпа цього винятку Обробка поновлюється з першого твердження в блоці перехоплення і після цього продовжується в звичайному режимі

У даному випадку мережева помилка, що виникає при спробі вважати сторінку з мережі, викличе різке завершення як ReadPageFromNet, так і getPage Після того як блок перехоплення запише в журнал повідомлення про невдачі, цикл for знову спробує отримати сторінку, і так до досягнення показника MAXRETRIES

Корисно мати чітке уявлення про те, як організований корінь дерева класів винятків в Java (рис 21)

Всі винятку є підкласами Throwable Практично не існує причин, за якими варто було б ставити в коді посилання на Throwable Вважайте його просто абстрактним базовим класом з двома підкласами: Error і Exception Error і його підкласи Призначені для вирішення проблем, що виникають з самим середовищем часу виконання Dalvik Ви, звичайно, можете написати код, який, здавалося б, зможе перехоплювати Error (або Throwabl е), але насправді відловлювати їх ви не зможете Зокрема, очевидним доказом цього є приклад із страхітливим ООМЕ – так скорочено називають помилку OutOfMemoryException Коли в системі Dalvik закінчується память, вона, можливо, не зможе завершити виконання навіть найдрібнішого коду операції Якщо ви напишете хитрий код, який спробує перехопити ООМЕ, а потім виділити певний блок заздалегідь зарезервованої памяті, це може спрацювати – або не спрацювати Якщо ви пишете код, який намагається перехопити Throwable або Error, вважайте, що ви тягаєте воду решетом

Рис 21 Базові класи виключень

Java вимагає, щоб в сигнатуру методу входили винятку, які цей метод може викидати У попередньому прикладі getPage оголошує, що він викидає три винятки, оскільки використовує три методи, кожен з яких може викинути одне Методи, що викликають getPage, повинні, в свою чергу, оголошувати всі три винятки, що викидаються getPage, а також і всі інші винятки, які можуть викидатися якими іншими методами, які може викликати getPage

Як ви розумієте, ця ситуація виявляється обтяжливою для методів, розташованих досить високо в дереві викликів Можливо, методу верхнього рівня буде потрібно оголосити десятки видів самих різних винятків просто тому, що він викликає методи, здатні їх викидати Для полегшення цієї проблеми можна створити дерево винятків, конгруентне дереву додатки Памятайте, що від методу потрібне тільки оголошувати супертіпи для усіх винятків, які він викидає Якщо створити базовий клас під назвою MyAppl іcationException, а потім зробити з нього підкласи MyNetworkException і MyUI Exceptіon відповідно для підсистем, зайнятих роботою з мережею і з інтерфейсом користувача, то в коді верхнього рівня знадобиться обробляти тільки МуАррlіcationException

Але насправді це половинчасте рішення Припустимо, виконання мережевого коду не вдається де-небудь по шляху до точки, розташованої глибоко в надрах додатки Наприклад, не вдається встановити мережеве зєднання Виняток продовжує вискакувати, незважаючи на всі повторні спроби і альтернативи У якийсь момент воно стає абсолютно розмитим і зводиться до того, що «щось пішло не так» Наприклад, конкретний виняток бази даних не має ніякого значення для коду, який намагається автоматично підставити набирається телефонний номер При додаванні виключення до сигнатурі методу саме на цьому етапі виникає ситуація, яка попросту незручна: ви можете і прямо оголосити, що всі ваші методи викидають Exception

Runt и meException – це особливий підклас Exception До підкласам Runt и meException відносяться непроверяемие винятки, які не обовязково оголошувати Наприклад, наступний код буде скомпільовано без помилок:

У спільноті розробників Java йдуть серйозні дискусії про те, коли слід і коли не слід використовувати непроверяемие винятку Очевидно, у додатку можна користуватися тільки непроверяемимі винятками і ніколи не оголошувати ніякі виключення ні в одній з сигнатур вашого методу У деяких школах програмування на Java це навіть рекомендується Проте, застосовуючи перевіряються винятку, ви можете використовувати компілятор для перевірки свого коду, а це вельми відповідають духу статичної типізації Ви будете орієнтуватися при роботі на свій досвід і смак

Фреймворк колекцій Java

Фреймворк колекцій Java – це один з найбільш потужних і зручних інструментів цієї мови Він надає обєкти, які є колекціями обєктів: списки, набори і карти Всі інтерфейси і реалізації, складові цю бібліотеку, знаходяться в пакеті Javauti 1

У Java uti 1 залишилося кілька застарілих класів, які можна вважати реліктами По суті, вони вже не відносяться до фреймворку Краще їх запамятати і намагатися не використовувати Мова про класах Vector, Hashtable, Enumeration і Dictionary

Джерело: Android Програмування на Java для нового покоління мобільних пристроїв

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*