Реклама

Изузетак у програмирању означава изузетно стање у неком тренутку извршења програма. Користи се када се изванредни услови могу боље бавити другде, а не где се сусрећу. Размотрите следеће примере:

  • Неуспјех у отварању конфигурацијске датотеке може се боље ријешити већим бројем кода, можда кориштењем алтернативне локације конфигурацијске датотеке.
  • Приступ ан Арраи ставка Како се користи Јава АрраиЛистЈава арраилист је низ за општу намену који се може променити. Пружа већину објеката који се обично очекују од низова на другим језицима. У овом чланку ћете научити да поставите и користите арраилист. Опширније изван граница низа означава програмску грешку. Срећно отклањање грешака!
  • Погрешка при рашчлањивању КСМЛ-а треба бити обавештена од корисника да би се КСМЛ датотека могла исправити.
  • Програм коме недостаје меморије (можда приликом обраде велике датотеке) може се исправити можда повећањем количине меморије која је доступна у јава процесу.

У свим овим случајевима (и више), изузетак би требало да се поступа изван локације на којој је генерисан како би се узрок могао решити.

Врсте изузетака

На слици испод приказани су главни делови Јава хијерархије изузетка. Основна класа је Тхровабле у који се подразумева Изузетак и Грешка. Класа Изузетак је за услове повезане са програмом које апликације могу ухватити у покушају да реше ситуацију. Класа Грешкас друге стране је за указивање на озбиљне грешке у Јава Рун-тиме окружењу које апликације не би требало да ухвате. Неки су примери: ОутОфМемориЕррор и СтацкОверфловЕррор.

Хијерархија изузетака

Ан Изузетак поново је две врсте: проверено и непроверено. Означени изузетак мора да обрађује позивни код. Ово правило спроводи јава преводилац. С друге стране, неконтролирани изузетак може се ширити у ланац позива без да се изричито декларише. Примјери у наставку ће разјаснити.

Проверене изузетке

Следећи метод покушава да креира ФилеРеадер из датотеке. Конструктор избацује обележени изузетак ФилеНотФоундЕкцептион које мора да обрађује позивни код или је декларисано да би било бачено.

Следећи код ће не компајлирати јер не ради ни једно ни друго.

приватна воид лоадФиле (назив датотеке стрингова) {ФилеРеадер ин = нови ФилеРеадер (назив датотеке); }

Један од начина да се добије код за компајлирање је руковање са изузетком (види доле).

приватна воид лоадФиле (назив датотеке стрингова) {покушајте {ФилеРеадер ин = нови ФилеРеадер (назив датотеке)); {} хватање (ФилеНотФоундЕкцептион ек) {// овде изузетак} }

Ако изузетак не може директно да обрађује саговорник, то мора бити декларисано у потпису методе.

привате воид лоадФиле (Стринг филенаме) баца јава.ио. ФилеНотФоундЕкцептион. {ФилеРеадер ин = нови ФилеРеадер (назив датотеке)); { }

Непроверени изузеци

Неконтролирана изузетак је она из које се подразумева РунтимеЕкцептион и са њима се не мора руковати директно или декларирати као горе. На пример, следећи код резултира а НуллПоинтерЕкцептион, што је врста РунтимеЕкцептион. Код се, међутим, саставља без грешке од тада НуллПоинтерЕкцептион је неконтролисан изузетак.

приватна воид ручкаЕвент () {Име низа = нулл; иф (име.ленгтх ()> 0) {} }

Изузеци за превијање

С обзиром на горњу расправу о провереним и неконтролираним изузецима, чини се да је лакше носити се са неконтролираним изузецима јер их не морате декларисати или сами поступати са њима. Имајући то на уму, понекад може бити корисно да означени изузетак уврстите у неконтролисан изузетак.

Следећи пример кода показао је како да направите корак са изузетком. Метода метход_1 () баца ан СКЛЕкцептион у свом телу. Да би се код правилно саставио, изузетак мора бити проглашен бацањем.

привате воид метход_1 () баца СКЛЕкцептион {... баците нову СКЛЕкцептион; }

Када се ова метода позива из друге методе (метход_2 ()), та метода може ухватити СКЛЕкцептион и умотајте га у неконтролирани изузетак, тако да не мора да изјави изузетак у свом потпису методе.

привате воид метход_2 () {покушај {метход_1 (); } улов (јава.скл. СКЛЕкцептион ек) {баците нову РунтимеЕкцептион (ек); } }

Траце стацк изузетка

Изузетак Стацк Траце односи се на низ активних оквира снопака, од којих сваки представља методу позива, снимљену од стране ЈВМ-а у тренутку када је изузетак бачен. Сваки оквир снопа укључује локацију позива методе, укључујући име класе, назив методе и евентуално име изворне датотеке Јава датотеке и број линије у датотеци. То је корисно за проналажење редоследа позива то је изазвало грешку Изузеци Јава: Да ли се рукујете њима добро?Изузетак у програмирању означава изузетно стање у извођењу програма. Користи се када се стање може боље решити на другом месту. Размотрите следеће примере руковања изузетком Јава. Опширније .

Овде је типичан траг стака, добијен од објекта изузетка када је ухваћен.

Изузетак у теми "главни" јава.ланг. ИндекОутОфБоундсЕкцептион: Индек: 8, Величина: 5 на јава.утил. АрраиЛист.рангеЦхецк (АрраиЛист.јава: 653) на јава.утил. АрраиЛист.гет (АрраиЛист.јава: 429) на сампле.сампле1.маин (сампле1.јава: 24)

Изузетак овде ухваћен је ИндекОутОфБоундсЕкцептион. То укључује додатне информације о грешци. Траг снопа садржи 3 оквира снопа, од којих сваки садржи информације о локацији као што је приказано.

Руковање изузецима

Изузетак се може обрадити тако што ћете га ухватити у а покушај да ухватиш блокирати и предузети све корективне акције. Тхе Изузетак објект пружа неколико метода за вађење информација о стању које га је проузроковало.

Следећи код евидентира поруку о грешци у датотеку дневника.

приватна воид лоадЦонфиг () {покушајте {// позовите код који може створити улов ИОЕкцептион} (јава.ио. ИОЕкцептион ек) {// овде обрађује изузетак. Може се пријавити у датотеку дневника. лог.варнинг (ек.гетМессаге ()); } }

Када је изузетак омотан унутар другог, можете да преузмете замотани изузетак:

Узрок бацања = ек.гетЦаусе (); лог.варнинг ("Основни узрок:" + узрок.гетМессаге ()); 

Морате ли приступити трагу стока и можда издвојити име методе који га је изазвао?

СтрингБуилдер сбуф = нев СтрингБуилдер ("Стацк Траце:"); фор (СтацкТрацеЕлемент ел: ек.гетСтацкТраце ()) {сбуф.аппенд (ел.гетЦлассНаме () + "." + ел.гетМетходНаме ()). додај ("\ н"); } лог.варнинг (сбуф.тоСтринг ());

Или можда забележи изузетак и поново га баци?

покушати {... } улов (јава.ио. ИОЕкцептион ек) {лог.варнинг (ек.гетМессаге ()); бацити ек; }

Тхе Изузетак класа пружа принтСтацкТраце () метода која може исписати траг стека по вашем ПринтСтреам (или ПринтВритер).

покушати {... } улов (јава.ио. ИОЕкцептион ек) {ПринтСтреам оут =...; оут.принтлн (ек.гетМессаге ()); ек.принтСтацкТраце (оут); }

Можете ухватити више врста изузетака у једном покушати блокирају и извршавају специфично руковање за сваку врсту изузетака.

покушајте {// овде баца неке изузетке. } улов (јава.ио. ИОЕкцептион ек) {// Овде је специфично ИОЕкцептион руковање. } улов (јава.скл. СКЛЕкцептион ек) {// СКЛЕкцептион специфично руковање овде. }

Да бисте ухватили више врста изузетака, али користили исти код за руковање, можете прогласити а улов блок са више типова на следећи начин:

покушајте {// овде баца неке изузетке. } улов (јава.ио. ИОЕкцептион | јава.скл. СКЛЕкцептион ек) {// ИОЕкцептион и СКЛЕкцептион специфично руковање овде. } хватање (САКСЕкцептион ек) {// САКСЕкцептион специфично руковање овде. }

Чишћење ресурса коначно

Када се бавите кодом који може довести до изузетака, од кључног је значаја да се правилно очисти било који ресурс, као што су отворене датотеке Све што требате знати о форматима датотека и њиховим својствимаДатотеку речи користимо заменљиво: музика, слика, табела, презентација и тако даље. Али шта фајл уопште чини "фајлом"? Покушајмо да разумемо овај основни део рачунања. Опширније , везе са базама података итд. Чишћење ресурса треба обавити у а напокон блокирати. На овај начин се и нормалан и изванредан излаз из блока позива на код за чишћење 10 најгорих грешака у програмирању у историјиУ својој приземној прошлости кодирао је и уништавање кованих ствари. Примјери мало лошег кода узроковали су катастрофу на већем нивоу. Следи 10 најгорих грешака у програмирању у историји. Опширније .

ИнпутСтреам ин = нулл; покушати {... ин = нови ФилеИнпутСтреам (име датотеке);... } улов (јава.ио. ИОЕкцептион ек) {лог.варнинг (ек.гетМессаге ()); } на крају {// код се овде извршава при изласку из пробног блока, // било да је то нормално или изузетак ако (ин! = нулл) ин.цлосе (); }

Покушајте са ресурсима

Јава 1.7 је представила пробајте са ресурсима конструкција која олакшава чишћење ресурса. То изгледа овако:

покушајте (ИнпутСтреам у = новом ФилеИнпутСтреам (..)) {// код који користи ИнпутСтреам. }

Кад код изађе из блока (било чисто или због изузетка), ИнпутСтреам променљива се аутоматски чисти.

Очистите више ресурса тако што ћете их пријавити у глави блока.

пробајте (ИнпутСтреам ин = нови ФилеИнпутСтреам (..); Цоннецтион цон =...; ) {// код који користи ИнпутСтреам и везу. }

Било који објект чија класа имплементира АутоЦлосеабле интерфејс се може очистити на овај начин. Следећа класа изводи неко одређено чишћење у Близу() метод.

МиЦласс јавна класа имплементира Аутоматско затварање {публиц воид цлосе () {// овде чисти код}} }

Користите инстанцу ове класе у а пробајте са ресурсима блокирати.

пробајте (МиЦласс обј = нови МиЦласс (..)) {// код који користи МиЦласс објект. }

Неке уобичајене изузеће

Погледајмо сада неке изузеће који се често сусрећу.

  • ИндекОутОфБоундсЕкцептион (неозначено): показује да је индекс елемента коме се приступа изван граница низа, низа итд.
  • СКЛЕкцептион (потврђено): бачено због грешке у бази података.
  • ИОЕкцептион (потврђено): грешка у приступу датотеци или грешке које се односе на улаз и излаз.
  • ИнтерруптедЕкцептион (означено): бачено када је прекид извођења нити.
  • САКСЕкцептион (потврђено): бачено због грешака у рашчлањивању КСМЛ-а.
  • НуллПоинтерЕкцептион (неозначено): користећи нулл тамо гдје је објект потребан.

Окончање

Изузеци су примарна метода за пријављивање и управљање грешкама у Јави. Правилна употреба изузетака побољшати квалитет кода Брже писање или кодирање у вашем уређивачу текста Линуком с прилагођеним темамаВаш Линук уређивач текста не мора изгледати ручно и „функционално“. Зашто га не бисте подесили да бисте побољшали продуктивност, било да је то скрипт и кодирање или коришћење алата као уређивача маркирања? Опширније и помоћ у решавању проблема у производњи.

Имате ли неке ратне приче везане за изнимке? Ако је то случај, реците нам о томе у одељку за коментаре испод.

Кредитна слика: Дмитри Николаев преко Схуттерстоцк.цом