Блок try / catch

Для обробки помилок в Java можуть бути використані пять ключевихслов: try, catch, finally, throw і throws Після одного блоку try можна поставити кілька блоків catch, якщо передбачається, що може відбутися більш ніж одна помилка Наприклад, коли програма намагається прочитати файл, його може не виявитися на місці, і виникне виключення FileNotFoundException Або ж, якщо файл знайдений, але програма продовжує зчитувати після кінця цього файлу, ви отримаєте виключення EOFExceptionСледующій фрагмент коду виведе повідомлення російською мовою, якщо програма не зможе знайти файл з рахунком гри або досягне кінця файлу Для інших помилок читання код виведе повідомленняПроблема при читанні файлу і технічний опис проблеми public void getScores(){

try{

fileScoresread()

Systemoutprintln (Рахунок гри успішно завантажений)

}catch(FileNotFoundException e) {Systemoutprintln (Не знайдений файл Scores)

}catch(EOFException e1) {Systemoutprintln (Досягнуто кінець файлу)

}catch(IOException e2){

Systemoutprintln (Проблема при читанні файлу +

e2getMessage())

}

} Якщо виконання методу read () перерветься, програма перестрибне через рядок з викликом println () прямо в блок catch для підходящої помилки Якщо такий блок знайдений, то виконається відповідний println (), а якщо відповідний блок catch знайти не вдасться, метод getScores () перенаправляє це виключення методу, його визвавшемуЕслі ви пишете кілька блоків catch, вам слід розташовувати їх у порядку, згідно з тим, як відповідні винятки успадковані один від одного Наприклад, так як EOFException – це підклас IOException, потрібно розташувати блок catch для підкласу спочатку Якщо ж перший помістити catch для IOException, тоді програма ніколи не досягне FileNotFound або EOFException, так як перший catch буде їх перехвативатьНачіная з Java 7, можна відловлювати відразу кілька винятків в одному

блоці catch:

public void getScores(){

try{

fileScoresread()

Systemoutprintln (Рахунок гри успішно завантажений)

}catch(FileNotFoundException | EOFException | IOException e){

}

}

Systemoutprintln (Проблема при читанні файлу +

egetMessage())

Ледарі запрограмують метод getScores () ось так:public void getScores(){

try{

fileScoresread()

}catch(Exception e){

Systemoutprintln ((Проблема при читанні файлу +

egetMessage())

}

}

Це приклад поганого стилю програмування При написанні програми, завжди потрібно памятати, що хто – то інший може захотіти її прочитати, і вам може бути соромно за свій код

Блок catch отримує обєкт типу Exception, який містить короткий опис виниклої проблеми, а його метод getMessage () повертає цей опис Іноді, якщо опис помилки не до кінця зрозуміло, спробуйте використовувати метод toString ():

catch(Exception e){

Systemoutprintln (Проблема при читанні файлу + etoString ())

}

Якщо потрібна більш детальна інформація про виключення, використовуйте метод printStackTrace () Він виведе послідовність викликів, яка призвела до виникнення виключення, таку ж, як у прикладі з розділу Читання трасування стека Давайте спробуємо «вбити» програму-калькулятор з глави 6 Запустіть клас Calculator і введіть з клавіатуриabc Натисніть будь-яку з кнопок арифметичних дій і ви отримаєте на екрані консолі що – то зразок цього:

javalangNumberFormatException:  For input string: &quotabc&quot at javalangNumberFormatExceptionforInputString(NumberFormat Exceptionjava:48)

at javalangFloatingDecimalreadJavaFormatString(FloatingDeci maljava:1213)

at javalangDoubleparseDouble(Doublejava:202)

at

CalculatorEngineactionPerformed(CalculatorEnginejava:27)

at javaxswingAbstractButtonfireActionPerformed(AbstractButt onjava:1764)

Це був приклад реакції програми у випадку необробленого виключення У методі actionPerformed () класу CalculatorEngine є наступна рядок: displayValue = DoubleparseDouble (dispFieldText) Якщо змінній dispFieldTest присвоєно НЕ числове значення, метод

parseDouble () не зможе конвертувати його в значення типу double і

викличе виключення NumberFormatException

Давайте опрацюємо це виключення та відобразимо повідомлення про помилку, яке пояснить ситуацію користувачеві Рядок, що містить parseDouble () повинна бути поміщена в блок try / catch, і Eclipse в цьому допоможе Виділіть цей рядок і клацніть на ній правою кнопкою миші В меню оберіть пункт Source  and  Surround  with try/catch block Вуаля Код змінився: try {

displayValue= DoubleparseDouble(dispFieldText)

} catch (NumberFormatException e1) {

// TODO Auto-generated catch block e1printStackTrace()

}

Замініть рядок з printStackTrace () на наступний код:

javaxswingJOptionPaneshowConfirmDialog(null, Будь ласка, введіть число, Неправильний введення,

javaxswingJOptionPanePLAIN_MESSAGE)

return

Так ми позбулися страхітливою трасування стека в повідомленні про

помилку і тепер відображаємо просте для розуміння повідомлення Будь ласка, введіть число: Тепер виняток NumberFormatException буде оброблятися Ключове слово throws

У деяких випадках, більш доцільно обробляти виключення не в тому методі, де воно виникло, а в тому, який eго викликав У таких

випадках, в описі методу необхідно оголосити (попередити), що він може викликати деякий виняток Це робиться за допомогою спеціального ключового слова throws Давайте використовуємо той же приклад з читанням файлу Так як метод read () може викликати виключення IOException, ви повинні або обробляти його, або оголосити його в описі методу У наступному прикладі ми оголосимо, що метод getAllScores () може викликати виключення IOException:class MySuperGame{

void getAllScores() throws IOException{

/ / Не використовуйте try / catch, якщо ви не

/ / Обробляєте виключення всередині цього методу

fileread()

}

public static void main(String[] args){ MySuperGame msg = new MySuperGame()

Systemoutprintln (Список результатів гри)

try{

/ / Так як getAllScores () оголошує виняток,

/ / Ми обробляємо його тут

msggetAllScores()

}catch(IOException e){

Systemoutprintln(

“Вибачте, список результатів гри недоступний)

}

}

Так як ми навіть не намагаємося перехоплювати виключення в методі getAllScores (), виключення IOException перенаправили з нього в викликав його метод main () Тепер це виняток повинен обробити головний метод

Ключове слово finally

Виконання будь-якого коду всередині блоку try / catch може закончітьсяоднім з таких варіантів:

ü  Виконання коду в блоці try закінчилося успішно, іпрограмма продовжує роботу

ü  Код всередині блоку try досяг вираження return івишел з методу

ü  Код всередині блоку try викликав виняток, і контроль перейшов до відповідного блоку catch, який або обробляє помилку, або перенаправляє виняток до методу, який викликав текущійЕслі є код, який необхідно виконати в будь-якому випадку, помістіть його після ключового слова finally:try{

fileread()

}catch(Exception e){

printStackTrace()

}finally{

/ / Код, який завжди повинен виконуватися

/ / Поміщається сюди, наприклад fileclose ()

}

Якщо написати код для закриття файлу в блок finally, то він виконається незалежно від того, чи пройшла операція читання успішно чи ні Зазвичай, в блок finally поміщається код, який звільняє будь – які ресурси компютера, наприклад, виробляє відключення від мережі або закриття файлаЕслі ви не плануєте обробляти виключення в поточному методі, вони будуть передані в викликав метод У такому випадку, ви можете використовувати ключове слово finally навіть без блоку catch: void myMethod () throws IOException{

try{

/ / Помістіть сюди код, який зчитує файл

}

finally{

/ / Помістіть сюди код, який закриває файл

}

}

Ключове слово throw

Якщо в методі виникло виняток, але його має обробити викликав метод, просто перенаправьте його цим методом Іноді вам може знадобиться перехопити один виняток, а відправити далі інше, з іншим описом помилки, як у наведеному далі коді Вираз throw (кидати) призначено для кидання (відправлення) Java – обєктів Обєкти, які кидаються програмою, повинні бутикиданими Це означає, що ви можете кидати тільки обєкти, прямо або побічно успадковані від класу Throwable Усі винятки в Java є нащадками цього класу У наступному фрагменті коду метод getAllScores () перехоплює виключення IOException, створює новий обєкт типу Exception з більш зрозумілим описом помилки і відправляє його в метод main () Тепер, метод main () НЕ скомпіліруется, якщо ви не помістіть рядки з викликом методу getAllScores () в блок try / catch, так як цей метод може викликати виключення Exception, яке має бути, або оброблено, або перенаправлено далі Метод main () не повинен створювати жодних винятків, тому повинен обробляти їх

class ScoreList{

/ / Для компіляції цього класу потрібен додатковий код

static void getAllScores() throws Exception{

try{

fileread () / / цей рядок може викликати виключення

} catch (IOException e) {

throw new  Exception (

“Дорогий друг, у файлі Scores є проблеми)

}

}

public static void main(String[] args){ Systemoutprintln(&quotScores&quot)

try{

getAllScores()

}catch(Exception e1){

Systemoutprintln(e1getMessage())

}

}

}

У випадку помилки роботи з файлом, головний метод обробить її, а метод e1getMessage () виведе повідомлення Дорогий друг ..

Джерело: Java Programming for Kids, Parents and Grandparents by Yakov Fain

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


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

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

Ваш отзыв

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

*

*