Вікіпідручник
ukwikibooks
https://uk.wikibooks.org/wiki/%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0
MediaWiki 1.39.0-wmf.23
first-letter
Медіа
Спеціальна
Обговорення
Користувач
Обговорення користувача
Вікіпідручник
Обговорення Вікіпідручника
Файл
Обговорення файлу
MediaWiki
Обговорення MediaWiki
Шаблон
Обговорення шаблону
Довідка
Обговорення довідки
Категорія
Обговорення категорії
Полиця
Обговорення полиці
Рецепт
Обговорення рецепта
TimedText
TimedText talk
Модуль
Обговорення модуля
Gadget
Gadget talk
Gadget definition
Gadget definition talk
Англійська мова
0
3293
36943
36291
2022-08-14T18:46:42Z
37.249.5.137
wikitext
text/x-wiki
'''Англійська мова''' ({{lang-en|[the] English [language]}}) — мова англійців (офіційна мова Англії і де-факто всієї Великої Британії), жителів США (офіційна мова тридцяти одного штату), одна з двох офіційних мов Ірландії, Канади і Мальти, офіційна мова Австралії, Нової Зеландії. Вона використовується, як офіційна, у деяких державах Азії (Індія, Пакистан та ін.) і Африки.
Відноситься до [[w:Германські мови|германських мов]] [[w:Індоєвропейські мови|індоєвропейської сім'ї]] мов. Число носіїв англійської як рідної — близько 410 млн, говорять (включаючи [[w:друга мова|другу мову]]) — близько 1 млрд людей (2007). Одна з шести [[w:ООН#Мови ООН|офіційних і робочих мов]] [[w:ООН|ООН]].
== Вступ ==
В сучасному глобальному суспільстві [[:w:англійська мова|англійська мова]], відіграє дуже важливу роль. По-перше, вона на даний час є основною мовою міжнародного спілкування, мовою, яка широко використовується в системі управління, господарстві, політиці, сфері освіти, науки, спорті, культури глобального суспільства, в багатьох установах і товариствах, особливо міжнародних. Англійська мова вивчається багатьма людьми у багатьох країнах нашої планети.
== Історія розвитку ==
Свій міжнародний статус англійська мова заслужила по праву. Для того, щоб перетворитися на міжнародну мову їй довелося пройти тривалий шлях розвитку. Упродовж всього свого розвитку англійська мова формувалася як суміш мов різних племен і народів. Основою для неї послужили мови стародавніх германських племен, англів і саксів, які переселилися до Англії. Ці племена належали до групи нижньогерманських племен - стародавніх вояків, піратів, моряків, лісовиків, рибалок і торгівців, володарів узбережжя Північного і Балтійського морів. Нащадками і духовними спадкоємцями цих племен крім сучасного англомовного населення Великої Британії, США і Австралії є також населення сучасних Нідерландів, північної Германії Балтійського морів виявилося повязаним великою кількістю різноманітних звязків, що відігравало велике значення на протязі всієї історії даного регіону.
В місцевостях, де знаходяться сучасні Велика Британія і Нідерланди землі вищезгаданих стародавніх германомовних племен межували з кельтськими племенами (галлами або гелами) - стародавнім населенням південної і західної Європи, людьми, нащадками яких себе вважає населення сучасної Франції, Бельгії, Ірландії, Шотландії тощо. Таким чином, після переселення англів і саксів до Англії англійська мова почала своє формування на межі двох різних груп племен і культур.
Наступним важливим періодом у розвитку англійської мови став період тісної взаємодії населення Британії з Римською імперією і отже англійської мови з латинською, який практично тривав до кінця XIX ст. (коли після розвалу Священної Римської імперії і занепаду її спадкоємиці Австро-Угорської імперії, латина остаточно втратила свій статус мови міжнародного спілкування, адміністрації, науки і культури в країнах Європи). Результатом цього періоду стало включення величезної кількості латинських слів і коренів до англійської мови, які на даний час становлять по деяким оцінкам близько третини словниково запасу.
В епоху Середньовіччя і Відродження, Англія, яка знаходиться на перетині морських шляхів з Північної Європи до Середземного моря зазнала впливу завойовників в образі вікінгів і французів, торгівців міст Ганзи (в першу чергу голландців і жителів півночі Германії - узбережжя Північного і Балтійського морів). Це відобразилося на тому, що з одного боку до англійської мови потрапило багато слів з французської мови, а з іншого англійська мова продовжувала розвиватися у тісному звязку з нідерландською, нижньонімецькою і скандинавськими мовами.
Бурхливий розвиток і поширення англійської мови в світі почалося після занепаду Священної Римської імперії і переходу важілів впливу на розвиток глобального суспільства до Британської імперії, а від неї до США, перетворення Британії і США на світові фінансові центри, а отже важливі геополітичні центри глобального суспільства. В ці часи англійська мова почала поповнювати свій словниковий запас за рахунок слів з різних мов світу.
== Абетка ==
При використанні будь-якої мови в наш час книжок, компьютерів і Міжмережжя важливо знати ті системи письма (абетки), які використовуються для запису цієї мови, в даному випадку англійської.
Для запису англійської мови використовується звичайна латинська абетка:
Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz
Завдяки цьому факту в більшості випадків букви позначають ті самі звуки, що і у більшості європейських мов. Це дозволило англійській мові запозичувати слова з цих мов майже не змінюючи їх написання і вимови. Але наслідком цього стало те, що в словах запозичених, скажімо, з латинської і французської мови одні й ті самі букви можуть читатись по різному. В першу чергу саме звичаєм залишати в англійській мові іншомовні слова в їх початковому написанні пояснюється та плутанина, яка існує в англійській мові з правилами вимови слів.
== Вимова і правила читання ==
Одною з складностей, які існують в англійській мові є те, що слова часто вимовляються не так як пишуться, тобто відсутня однозначна відповідність між буквами і звуками, одна й та сама буква може позначати різні звуки і її вимова визначається лише у звязку з сусідніми буквами.
Вимова складів в більшості германських мов, зокрема в англійській залежить від того, яким є склад - наголошеним чи ненаголошеним, відкритим чи закритим, довгим чи коротким.
Основний наголос в англійській мові, так само як і в більшості германських мов падає як правило на один з складів кореня слова, зазвичай перший. Якщо слово відносно коротке ( 2 - 4 склади), то всі інші склади, як правило вимовляються дуже коротко. Якщо в слові багато складів, то деякі склади можуть приймати додатковий наголос.
Приклади: comp'''u'''ter, voc'''a'''bulary, to transl'''a'''te
Відкритість чи закритість складу в слові визначається тим, на який звук він закінчується - голосний або приголосний. На письмі це в більшості випадків визначається тим, яка буква стоїть в кінці складу - голосна чи приголосна.
Довгота/короткість складу визначається довготою/короткістю відповідного голосного звуку. Голосні звуки в англійській мові можуть позначатись однією або декількома буквами, перша з яких голосна, а інші можуть бути як голосні так і приголосні H, R, W, Y, наприклад A, AE, AH, AL, AR, AW, AY і т.д. У відкритому складі голосний як правило довгий, незалежно від того чи він позначається однією чи декількома буквами (law, late, there, site, love, lore, sure). У закритому складі голосний довгий, якщо він позначається більш ніж однією буквою (dark, week, sight, work, look, burn). Якщо він позначається лише однією голосною буквою, то він як правило короткий (man, men, stick, lock, but, luck).
Таким чином, одна й та сама буква, може позначати декілька голосних звуків - в ненаголошеному складі, в наголошеному відкритому складі, в наголошеному закритому складі, у сполученні з буквами R або H і у інших буквосполученнях.
В ненаголошеному складі голосні букви читаються як дуже короткий звук, схоже на українські звуки Е або И або не вимовляються зовсім: comp'''u'''ter - [ кемп'''ью'''те ] ([ кимп'''ью'''те ], [ кмп'''ью'''те ])
В наголошеному відкритому складі вимову окремих букв дуже легко запам'ятати, оскільки звучать вони як правило так само як назви цих букв в англійській абетці - A (ей), E (і:), I (ай), O (оу), U (ю). Тобто - сake (кейк), sheep (ші:п), like (лайк), alone (елоун), use (юз) та ін.
В наголошеному закритому складі вимова цих букв виглядає наступним чином - A (е), E (е), I (и), O (о), U (а). Приклади - man (мен), let (лет), stick (стик), lot (лот), but (бат).
Більшість букв, які позначають приголосні звуки читаються подібно до англійського алфавіту - B, D, F, K, L, M, N, P, S, V, Z.
Буква C може читатись як К, С або Ч. Якщо після неї стоять букви I або E то вона читається як С. Словосполучення CH читається як Ч, в усіх інших випадках буква С читається як К.
В деяких випадках букви можуть не читатись. Наприклад буква E після приголосної в кінці слова не читається, а служить для того, щоб зробити попередній склад відкритим - late, make.
== Мовотвір ==
=== Словобудова ===
В англійській словотворчі приставки (префікси-суфікси-закінчення) грають меншу роль ніж в українській, оскільки відсутнє таке явище як відмінкові закінчення в іменниках, прикметникові в прикметниках і майже відсутнє таке явище як особові закінчення в дієсловах. На значення слова і зміст речення сильно впливає місце слова у реченні, тобто порядок слів. Більшість приставок походять з латинської, староанглійської, французької мов або грецької мов.
a-, ad- - до- (add - додавати)
ab- - від- (abolition - зникнення, відсунення)
ex- - із-, ви- (excavator - викопувач, excalator - витягувач, підйомник)
-er - -ник, -ар, -ер, -ач, -учий (leader - ведучий, writer - письменник, reader - читач, master - майстер).
inter- - між- (international - міжнародний, міжнаціональний)
-less - без-, без (topless - безверхий, useless - без користі)
out- - із-, ви- (outstanding - видатний)
pro- - для-, на-, у напрямку (progress - прогрес, просування)
-ship - -ство (leadership - лідерство, partnership - партнерство)
-tion - -ання (addition - додавання)
-full - повний, -ий ([[wikt: beautiful| beautiful]] - красивий, красоти повний)
=== Дієслова ===
Дієслово - це дослівно слово, яке позначає дію. Особливістю англійської мови є те, що в ній дуже легко можна утворити дієслова практично від будь-якого іменника, назви предмета чи явища. Для цього часто достатньо додати перед цим словом службове слово to - щоб, до.
Приклади. work - робота, to work - робити, робити, працювати.
measure - міра, to measure - міряти, вимірювати і т.д.
Також поширені деякі дієсловотворчі приставки: -ize (to maximize), -fy (to notify) і т.д.
Таким чином, неозначена, словникова форма дієслова має вигляд '''to дієслово''', де дієслово - це так звана основна, базова форма дієслова, форма дієслова простого теперішнього часу для всіх осіб крім 3-ої особи однини, яка утворюється додаванням до основної форми закінчення -s (яке в староанглійській записувалось як -th і отже нагадує російське -т - работает, пишет, читает і т.д.):
Приклад (Простий теперішній час - Simple Present Tense).
to work - працювати.
I work - я працю(ю)
You work - ти працю(єш)
He
She works - він, вона, воно працю(є)
It
We work - ми працю(ємо)
You work - ви працю(єте)
They work - вони працю(ють)
Наступна важлива форма дієслова - це активний дієприкметник теперішнього часу і одночасно назва дії, який утворюється додаванням до базової форми дієслова закінчення -ing:
to write - писати -> writing - пишучий, писання
На основі цієї форми в англійській мові утворюються форми часів дієслова тривалої групи - continuous tenses, які дозволяють передавати тривалу дію, яка відбувається в той період часу, про який іде мова в реченні. Ці форми мають вигляд:
I am writing - Я є пишучий (тобто я пишу)
I was writing - Я був пишучий (тобто я писав)
I will be writing - Я буду пишучий (тобто я писатиму)
I have been writing - Я маю був пишучий (тобто я писав і на даний момент закінчив)
I had been writing - Я мав був пишучим (тобто я писав і на моент про який іде мова вже закінчив).
і т.д.
Наступна форма - це форма простого минулого часу дієслова. В більшості випадків вона утворюється правильно (тобто по правилам), додаванням закінчення -ed до базової форми дієслова, яке наближено відповідає українським закінченням минулого часу -ав, -ив (писав, читав, говорив):
I worked, You worked, He,She,It worked, We worked, You worked, They worked.
Остання важлива форма дієслова - це пасивний дієприкметник минулого часу (форма Participle II). Ця форма наближено відповідає українській формі дієприкметника дієслова робити - зроблений і для правильних дієслів утворюється додаванням закінчення -ed до базової форми дієслова, тобто співпадає з формою простого минулого часу.
Таким чином вся система часів в англійській мові побудована на наступних формах дієслова (на прикладі дієслова робити) - роблю, робив, роблячий, зроблений. Крім того широко використовуються у якості службових слів форми дієслів бути (to be), мати (to have) і бажати (to will). Вони дозволяють будувати конструкції типу - я маю написану книгу (I have written book), я є пишучий книгу (I am writing book), я хочу бути пишучим книгу (I will be writing book) і т.д.
Англійська мова має також багато модальних дієслів, які на відміну від інших дієслів не позначають діє або стани, вони позначають відношення мовця до дії, яка виражається інфінитивом у сполученні з модальним складеним присудком compound modal predicate.
Модальні дієслова в англійській мові по своїй суті виражають можливість, не можливіть якоїсь дії, ймовіність або неймовірність, обов'язковість (obligatory), необхідність, бажаність, сумнів тощо.
У цій мові є декілька модальних дієслів:
* [[can]];
* [[be able to]];
* [[may]];
* [[must]];
* [[ought]];
* [[shall]];
* [[should]];
* [[will]];
* [[need]];
* [[dare]].
Також до модальних слів англійської мови мовознавці відносять [[to have to]] та [[to be]].
Розподіл рівнів володіння мовою за [[w:Загальноєвропейські рекомендації з мовної освіти|CERF]]:
;''A'' Основи (Basic)
*''A1'' — Інтродуктивний або «відкриття» (Breakthrough or beginner)
*''A2'' — Середній або «виживання» (Waystage or elementary, Lower-Intermediate, Pre-Intermediate)
;''B'' Незалежний рівень (Independent)
*''B1'' — Рубіжний (Intermediate)
*''B2'' — Просунутий (Upper-Intermediate)
; ''C'' Досвідчений рівень (Proficient)
*''C1'' — Автономний
*''C2'' — Компетентний
== Книги ==
* [[Англійська як додаткова мова]] ([[:b:en:English as an Additional Language|English as an Additional Language]], рівень A)
* [[Просунута англійська для студентів B2]] ([[:b:en:English for B2 Students|English for B2 Students]])
== Посилання ==
* [[w:Англійська мова|Стаття про англійську мову у Вікіпедії]]
* [https://enguide.ua/ua/ Карта курсів англійської в Україні]
;Словники
* [https://en.oxforddictionaries.com/ Оксфордський тлумачний словник]
* [https://uk.glosbe.com/en/uk Англійсько-український словник Glosbe]
* [https://www.dict.com/англіисько-украінськии Англійсько-український словник Lingea]
* [https://www.multitran.ru/c/m.exe?&l1=1&l2=2&CL=1&a=0 Англо-русский и русско-английский словарь Мультитран]
;Безкоштовні онлайн-сервіси
* [http://opentalk.org.ua Граматика англійської мови]
* [https://uk.duolingo.com/course/en/uk/Вивчайте-Англійська Duolingo: вивчайте англійську безкоштовно]
* [https://lim-english.com/ Lim English]
* [http://www.bbc.co.uk/learningenglish/russian/home BBC Learning English] — сайт для тих, хто вивчає англійську мову.
** [http://www.bbc.co.uk/learningenglish/english/hygiene/lowerintermediate-syllabus Матеріали рівня Lower-Intermediate] (А2)
** [http://www.bbc.co.uk/learningenglish/english/hygiene/intermediate-syllabus Матеріали рівня Intermediate] (B1)
** [http://www.bbc.co.uk/learningenglish/english/hygiene/upperintermediate-syllabus Матеріали рівня Upper Intermediate] (B2)
** [http://www.bbc.co.uk/learningenglish/english/hygiene/towardsadvanced-syllabus Матеріали рівня Towards Advanced] (на шляху до просунутого)
** [http://www.bbc.co.uk/learningenglish/english/features/pronunciation Настанови з вимови]
** [https://skrivanek.pl/uk/perekladach-z-anhliyskoyi-na-ukrayinsku/]перекладач з англійської на українську
;Соціальні мережі для вивчення мов
* [https://polyglotclub.com/index/translate-ukrainian Polyglot Club]
* [https://www.tandem.net/ru/ TANDEM]
{{Стадія|25%}}
[[Категорія:Англійська мова]]
[[Категорія:Мови Європи]]
3zjq0yl6k37awtf92c4v0374kcbpqob
Освоюємо Java/Винятки
0
4311
36944
36940
2022-08-15T07:19:57Z
Володимир Груша
985
/* try з ресурсами */
wikitext
text/x-wiki
'''Виняткова ситуація''' або просто '''виняток''' (англ. exception) – це аварійний стан, який відбувається саме під час виконання програми. Прикладом є — ділення на нуль, помилки читання з файлу та мережі тощо. Іншими словами – це помилки які можуть виникнути при виконанні програми. В ряді мов програмування необхідно заздалегідь передбачити можливість тієї чи іншої помилки і передбачити шлях її обробки. В java для цього передбачений спеціальний механізм винятків.
==Винятки в java==
Виняток в java – це об'єкт, який описує виняткову (тобто, помилкову) ситуацію, що відбулась в певному місці коду. Коли така ситуація виникає створюється об'єкт, який передається («вкидається») в метод, в якому виникла помилка. Далі в методі даний виняток може оброблятися, або бути переданий ще кудись для обробки.
Розглянемо для прикладу наступну програму '''DivZero.java'''
<syntaxhighlight lang="java">
public class DivZero {
public static void main(String[] args) {
int my = 0;
int medium = 44 / my;
System.out.println("medium=" + medium);
}
}
</syntaxhighlight>
Як бачимо в програмі присутнє ділення на нуль. При компіляції ми не отримаємо помилок. Проте, після запуску програми, отримаємо наступне:
<pre>
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivZero.main(DivZero.java:4)
</pre>
Це так звана ''траса стеку викликів''. Перший рядок означає тип-винятку. Як бачимо тут маємо ArithmeticException з діленням на нуль. java.lang – це пакет класів, який завжди доступний в програмі і, який містить найбільш використовувані класи. Тобто його не потрібно імпортувати. Другий рядок вказує де саме відбулась виняткова ситуація: 4-й рядок у файлі DivZero.java в методі main() класу DivZero. При цьому як бачимо програма завершила своє виконання аварійно. Для уникнення цього існує відповідний механізм обробки винятків, який дозволяє перехопити виняток, одержати інформацію про нього, обробити його здійснивши певні дії для нормального закінчення або продовження виконання програми.
==Типи винятків==
[[File:Exceptions.jpg|400px|thumb|Ієрархія найбільш вживаних винятків]]
Усі типи винятків є підкласами класу '''Throwable''', який входить в базовий пакет класів Java - java.lang. Тобто він є вершиною ієрархії класів винятків. Його два підкласи '''Error''' та '''Exception''' утворюють дві основні гілки винятків.
Клас Error з його підкласами - це помилки виконавчого середовища java. І які зазвичай не виникають при нормальній роботі середовища java. Такі винятки зазвичай не можуть бути оброблені в програмі.
Гілка класу Exception - це винятки, які програма повинна вловлювати(catch). Від даного класу та його підкласів можна утворювати власні підкласи. Важливим його підкласом є клас '''RuntimeException'''. Винятки даного типу включають такі винятки як ділення на нуль та помилкова індексація масивів.
Актуальну ієрархію класів винятків можна подивитися і уточнити в офіційній документації до JDK<ref>[http://docs.oracle.com/javase/7/docs/api/index.html Java™ Platform, Standard Edition 7 API Specification (Натисніть TREE для перегляду ієрархії класів)]</ref>.
==Конструкція try==
Для обробки виняткових ситуацій використовується п’ять ключових слів: try, catch, throw, throws та finally.
Інструкції програми, в яких може виникнути помилка, контролюються за допомогою конструкції try.
Загальна форма наступна:
<pre>
try{
//блок коду для контролю над помилками
} catch (тип-винятку1 об’єкт-винятку) {
//дії при виникненні типу винятку1 (обробник винятку)
} catch (тип-винятку2 об’єкт-винятку) {
//дії при виникненні типу винятку2 (обробник винятку)
}
//….
[finally{
//дії при виході з конструкції try.
}]
</pre>
Після інструкції try ми розміщуємо «небезпечний» код, у блоці catch відбувається обробка винятку, причому може бути кілька інструкцій catch. При використанні кількох інструкцій catch необхідно зважати на ієрархію класів винятків. Класи нащадки повинні оброблятися раніше за батьківські класи. Інакше обробка конкретного винятку просто буде неможлива, оскільки першим буде викликаний catch з батьківським класом (див. поліморфізм) і до нащадків діло не дійде. Завершувати конструкцію може інструкція finally, в ній розміщується код, який буде виконаний або після завершення коду в конструкції try або після обробки винятку в інструкції catch.
Починаючи з java 7 стало можливим обробити два різнотипні винятки в одному блоці catch:
<pre>
catch (FileNotFoundException | UnknownHostException е) {
// дії при обробці винятків
}
</pre>
Так слід робити, якщо винятки не є підкласами один для іншого.
Таким чином можемо переписати програму з діленням на нуль:
<syntaxhighlight lang=java>
public class DivZero {
public static void main(String args[]){
int my=0;
try{
int medium=44/my;
System.out.println("medium="+medium);
}catch(ArithmeticException e){
System.out.println("Ділення на нуль!");
}
System.out.println("Продовження виконання...");
}
}
</syntaxhighlight>
Результат виконання:
<pre>Ділення на нуль!
Продовження виконання...</pre>
Як бачимо, для перехоплення винятку, код, через який виникала помилка, знаходиться у середині конструкції try. Також, зверніть увагу, що після виникнення виняткової ситуації наступний рядок ''System.out.println("medium="+medium);'' не було виведено, оскільки виняток був переданий для обробки в catch. Після інструкції програми в якій відбулась виняткова ситуація, всі наступні рядки до інструкції catch пропускаються і не будуть виконуватись. І, як бачимо з результату виконання, наша програма продовжила виконання по закінченню блоку try, а не завершила своє виконання аварійно.
Конструкція try може бути вкладеною в іншу конструкцію try.
===try з ресурсами===
При використанні всередині try певних ресурсів, наприклад, файлів, при виникненні винятку необхідно було передбачити закриття відкритих ресурсів. Для цієї мети раніше приходилося використовувати блок finally. У Java 7 з'явилася конструкція try з ресурсами (англ. try-with-resources)<ref>[https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html The try-with-resources Statement]</ref>. Тепер просто можна створити ресурс у дужках зразу ж після ключового слова try і java сама потурбується про закриття ресурсу. Приклад:
<syntaxhighlight lang="java">
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}</syntaxhighlight>
В конструкції try з ресурсами можна вказати декілька ресурсів:
<syntaxhighlight lang="java">
try (var in = new Scanner(new FileinputStream
("/usr/share/dict/words"), StandardCharsets.UTF_8);
var out = new PrintWriter("out.txt", StandardCharsets.UTF_8))
{
//код, що використовує ресурси
}
</syntaxhighlight>
==Throw==
В наведених вище прикладах ми здійснювали лише обробку винятків викинутих виконавчим середовищем java. Проте існує можливість викидання власних винятків. Для цього існує інструкція Throw. Загальна форма її наступна:
<pre>
throw ThrowableInstance;
</pre>
Тут ThrowableInstance – це тип винятку, який повинен бути або типом Throwable, або мати тип його підкласів. Щоб програма викинула ваш виняток необхідно скористатися оператором new. Для того, щоб одержати(перехопити) тип винятку можна скористатися інструкцією catch, як це ми робили вище.
Після інструкції throw відбувається аналогічне породження винятку як у вище наведених прикладах. Тобто усі інструкції пропускаються до найближчого блоку інструкції catch, де необхідно здійснити обробку винятку. Якщо catch не буде знайдено, то обробник винятків, що використовується по замовчуванню, призупиняє виконання програми і друкує відбиток стеку (stack trace).
Приклад:
<syntaxhighlight lang="java">
package exceptions;
public class ThrowNullException {
public static void main(String args[]){
try{
throw new NullPointerException("Пробний виняток");
}catch(Exception e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Наш витяток: java.lang.NullPointerException: Пробний виняток
</pre>
Програма демонструє як створювати один із стандартних винятків. Більшість вбудованих run-time винятків Java мають щонайменше два конструктори. Один за замовчуванням без параметрів і один із параметром String, який дозволяє задати додатковий опис. Опис можна вивести на консоль за допомогою методів '''print(), println()'''. Також його можна отримати використавши метод '''getMessage()''' класу Throwable. Тобто написати так:
<syntaxhighlight lang="java">
System.out.println(e.getMessage());
</syntaxhighlight>
В результаті отримаємо на консолі рядок:
<pre>Пробний виняток</pre>
Замість використання методів print() та println() можна написати e.printStackTrace() і отримати відбиток стеку(трасування стеку). Так якщо ми в наведеному виклику в catch використаємо '''e.printStackTrace()''':
<syntaxhighlight lang="java">
}catch(Exception e){
e.printStackTrace();
}
</syntaxhighlight>
то ми отримаємо в консолі:
<pre>
java.lang.NullPointerException: Пробний виняток
at exceptions.ThrowNullException.main(ThrowNullException.java:6)
</pre>
Можна створити власний тип винятку як підклас уже існуючого типу.
==Створення власних винятків==
Якщо вам не підходить жоден з існуючих класів винятків, то можна створити власний. Він повинен розширювати клас Exception, або будь-який із похідних класів.
<syntaxhighlight lang="java">
package exceptions;
import java.io.IOException;
class FileFormatException extends IOException
{
public FileFormatException () {} // конструктор по замовчуванню
public FileFormatException(String gripe) // конструктор, що забезпечує повернення зазначеного повідомлення
{
super(gripe);
}
}
</syntaxhighlight>
Тепер в коді, що повинен породжувати виняток можна вставити викидання даного винятку:<code>throw new FileFormatException(); </code>.
<syntaxhighlight lang="java">
package exceptions;
public class TestNewException {
public static void main(String[] args) {
try {
throw new FileFormatException("Не той формат файлу");
} catch (Exception e) {
System.out.println("Повідомлення винятку: "+e.getMessage());
}
}
}
</syntaxhighlight>
Результат:
<pre>
Повідомлення винятку: Не той формат файлу
</pre>
==Throws==
Якщо метод породжує виняток і не обробляє його, то він повинен вказати про це, щоб обробка винятку була здійснена у місці виклику даного методу. Це здійснюється за допомогою застереження throws в оголошенні методу. Після нього вказується підряд через кому усі винятки, які можуть бути викинуті методом, окрім винятків класів Error та RuntimeException і їхніх підкласів. Нагадаємо, що клас Error – це необроблювані винятки, RuntimeException – винятки, які виникають в результаті помилки програміста (вихід за межі масиву, нульове посилання, невірне перетворення типів). Інші винятки – це помилки доступу, які доволі часто вимагають відповідної обробки.
Загальна форма оголошення методу наступна:
<pre>
тип ім’я_методу(список_параметрів) throws список_винятків
{
// тіло методу
}
</pre>
Наступна програма демонструє використання throws у методі де виникає виняток IllegalAccessException.
<syntaxhighlight lang="java">
public class ThrowsException {
public static void exceptionMethod () throws IllegalAccessException{
System.out.println("Всередині exceptionMethod().");
throw new IllegalAccessException("Помилка доступу");
}
public static void main(String args[]){
try{
exceptionMethod();
System.out.println("Кінець програми"); //даний рядок не буде виведений
}catch(IllegalAccessException e){
System.out.println("Наш витяток: "+e);
}
}
}
</syntaxhighlight>
Результат:
<pre>
Всередині ExceptionMethod().
Наш витяток: java.lang.IllegalAccessException: Помилка доступу
</pre>
Як бачимо тепер обробка винятку відбувається у методі main(). Без інструкції try-catch програма призупинятиметься з друком відбитку стеку. Слід зауважити, що у методах інструкція throw поводить себе подібно до інструкції return. Тобто виконання методу припиняється і відбувається повернення в місце виклику методу.
Інструкцію throws не можливо використати при заміщенні методу в класах нащадках, якщо аналогічний метод батьківського класу не викидав виняток.
==Зчеплення винятків==
У java починаючи з версії jdk 1.4, тобто доволі вже давно, були введені зчеплені винятки (англ. chained exceptions). Їх можна, наприклад, використати коли у вас виникає ділення на нуль після вводу певного значення. В результаті виникає виняток ArithmeticException. Зрозуміло, що основною причиною є те, що з консолі (чи іншим чином) було введено 0, тобто основною причиною є помилка вводу і краще вказати виняток IOException. Тому ми можемо приєднати додаткову інформацію до того винятку, що був викинутий програмою.
Створити зчеплення винятків можна кількома способами.
Перший спосіб, це використання відповідних конструкторів:
<pre>
// Конструктор створює виняток із зчепленим причиною-винятком
Throwable(Throwable причина_винятку)
// Конструктор створює виняток із описом винятку та із зчепленим причиною-винятком
Throwable(String опис_винятку, Throwable причина_винятку)
</pre>
Також можна зчепити причину-виняток з існуючим винятком за допомогою метода initCause():
<pre>
Throwable initCause(Throwable причина_винятку)
</pre>
Щоб отримати доступ до причини-винятку, використовують метод getCause():
<pre>Throwable getCause()</pre>
Згаданий випадок, з діленням на нуль, демонструє наступна програма:
<syntaxhighlight lang=java>
package exceptions;
import java.io.IOException;
import java.util.Scanner;
public class TestChainedExceptions {
static public void doOperation() {
//використовуємо try з ресурсами
try (Scanner in = new Scanner(System.in);) {
System.out.print("Введіть дільник: ");
int divisor = in.nextInt();
int medium = 44 / divisor; //якщо 0, то викине виняток ArithmeticException
System.out.println("medium=" + medium);
}
catch (ArithmeticException e){
e.initCause(new IOException("Помилка вводу даних"));
throw(e); //викинути виняток знову із додатковою інформацією
//виняток буде вловлений в методі main()
}
}
public static void main(String[] args) {
try{
doOperation();
}catch(Exception e) {
System.out.println("Основний виняток: "+e);
System.out.println("Причина винятку: "+e.getCause());
System.out.println("Відбиток стеку:");
e.printStackTrace();
}
}
}
</syntaxhighlight>
Результат виконання:
<syntaxhighlight lang=java>
Введіть дільник: 0
Основний виняток: java.lang.ArithmeticException: / by zero
Причина винятку: java.io.IOException: Помилка вводу даних
Відбиток стеку:
java.lang.ArithmeticException: / by zero
at exceptions.TestChainedExceptions.doOperation(TestChainedExceptions.java:12)
at exceptions.TestChainedExceptions.main(TestChainedExceptions.java:23)
Caused by: java.io.IOException: Помилка вводу даних
at exceptions.TestChainedExceptions.doOperation(TestChainedExceptions.java:16)
... 1 more
</syntaxhighlight>
==Додаткові джерела==
* [http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html Урок: Винятки // Java посібники на сайті Oracle (англ)]
==Примітки==
<references/>
[[Категорія:Освоюємо Java]]
{{Гортання сторінок|Об'єкти і класи|Графічний інтерфейс користувача}}
l2wh7b7mkvz2qhgauujf5mf3rgvelr7