Како се на прави начин носити са Јава изузецима

Како се на прави начин носити са Јава изузецима

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





У овом чланку ћете научити шта су изузеци, зашто су важни, како их користити и честе грешке које треба избегавати. Већина модерних језика има неку врсту обраде изузетака, па ако икада пређете са Јаве, већину ових савета можете понети са собом.





Разумевање Јава изузетака

На Јави, ан изузетак је објекат који указује на нешто абнормално (или 'изузетно') током извођења ваше апликације. Такви изузеци су бачен , што у основи значи да је креиран објект изузетка (слично начину на који се грешке „подижу“).





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

NullPointerException

с пре него што нулл променљива има прилику да изазове пад.



Запамтите, изузетак је само објекат, али са једном важном карактеристиком: мора се проширити од

Exception

класе или било које подкласе





Exception

. Иако Јава има све врсте уграђених изузетака, можете и сами да креирате своје ако желите. Неке од најчешћи Јава изузеци укључују:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Шта се дешава када направите изузетак?





Прво, Јава гледа у оквиру непосредне методе да види има ли кода који обрађује врсту изузетка који сте бацили. Ако руковалац не постоји, он гледа метод који је позвао тренутни метод да види да ли тамо постоји руковалац. Ако не, гледа метод који је позвао то метод, а затим следећи метод итд. Ако изузетак није ухваћен, апликација штампа траг стека и затим се руши. (Заправо, то је више нијанси него једноставно рушење, али то је напредна тема изван опсега овог чланка.)

ДО стацк траце је списак свих метода које је Јава прешла док је тражила обрађивач изузетака. Ево како изгледа траг стека:

Exception in thread 'main' java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Из овога можемо много извући. Прво, бачени изузетак био је а

NullPointerException

. То се догодило у

getTitle()

метод у линији 16 књиге.јава. Та метода је позвана из

getBookTitles()

на линији 25 аутора.јава. То метода је позвана из

main()

на линији 14 Боотстрап.јава. Као што видите, познавање свега овога олакшава отклањање грешака.

Али опет, права корист од изузетака је та што се можете „носити“ са ненормалним стањем тако што ћете ухватити изузетак, исправити ствари и наставити апликацију без рушења.

Коришћење Јава изузетака у коду

Рецимо да имате

someMethod()

који узима цео број и извршава логику која би се могла сломити ако је цео број мањи од 0 или већи од 100. Ово би могло бити добро место за избацивање изузетка:

код грешке диснеи центра за помоћ 83
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

Да бисте ухватили овај изузетак, морате да одете где

someMethod()

се зове и користи блок покушај хватања :

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
}
// ...
}

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

У нашем примеру улазимо у три блок и одмах позивамо

someMethod()

. Пошто 200 није између 0 и 100, ан

IllegalArgumentException

је бачен. Ово одмах завршава извршавање

someMethod()

, прескаче остатак логике у блоку три (

someOtherMethod()

се никада не позива) и наставља извршавање унутар блока цатцх.

Шта би се догодило да позовемо

someMethod(50)

уместо тога? Тхе

IllegalArgumentException

никада не би био бачен.

someMethod()

извршило би се нормално. Блок три ће се нормално извршити, позивајући

someOtherMethod()

када сомеМетход () заврши. Када

someOtherMethod()

завршава, блок улова би се прескочио и

callingMethod()

би се наставило.

Имајте на уму да можете имати више блокова хватања по блоку покушаја:

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
} catch (NullPointerException e) {
// handle the exception in here
}
// ...
}

Такође имајте на уму да је изборно коначно блок такође постоји:

public void method() {
try {
// ...
} catch (Exception e) {
// ...
} finally {
// ...
}
}

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

Коначно блокирање треба да користите када имате објекте које је потребно очистити пре него што се метода заврши. На пример, ако сте отворили датотеку у блоку три и касније бацили изузетак, финални блок вам омогућава да затворите датотеку пре него што напустите методу.

Имајте на уму да коначно можете имати блок без блока цатцх:

public void method() {
try {
// ...
} finally {
// ...
}
}

Ово вам омогућава да извршите било какво потребно чишћење, а истовремено дозвољавајући избаченим изузецима да прошире стек позива метода (тј. Не желите да овде рукујете изузетком, али ипак морате прво да га очистите).

Проверено у односу на непроверене изузетке у Јави

За разлику од већине језика, Јава прави разлику између проверени изузеци и неконтролисани изузеци (нпр. Ц# има само непроверене изузетке). Чекирани изузетак мора бити ухваћен у методу где се изузетак баца или се код неће компајлирати.

Да бисте направили означени изузетак, проширите од

Exception

. Да бисте направили изузетак без провере, продужите од

RuntimeException

.

Сваки метод који баци означени изузетак мора то означити у потпису методе користећи баца кључна реч. Пошто је Јава уграђена

IOException

је означени изузетак, следећи код се неће компајлирати:

public void wontCompile() {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Морате прво да изјавите да баца означени изузетак:

public void willCompile() throws IOException {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

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

Када треба да користите проверене или непроверене изузетке?

Званична Јава документација има страницу о овом питању . Разликује сажето правило: „Ако се разумно може очекивати да ће се клијент опоравити од изузетка, учините га провереним изузетком. Ако клијент не може учинити ништа да се опорави од изузетка, нека то буде неозначени изузетак. '

Али ова смерница може бити застарела. С једне стране, проверени изузеци доводе до робуснијег кода. С друге стране, ниједан други језик није проверио изузетке на исти начин као Јава, што показује две ствари: прво, функција није довољно корисна да би је други језици украли, и друго, апсолутно можете живети без њих. Осим тога, проверени изузеци се не играју добро са ламбда изразима уведеним у Јави 8.

Упутства за употребу Јава Изузетака

Изузеци су корисни, али се лако злоупотребљавају и злоупотребљавају. Ево неколико савета и најбољих пракси које ће вам помоћи да избегнете неред.

  • Радије дајте посебне изузетке општим изузецима. Користите | _+_ | преко | _+_ | ако је могуће, у супротном користите | _+_ | преко | _+_ | када је то могуће.
  • Никад не хватај | _+_ | ! Тхе | _+_ | класа се заправо проширује | _+_ | , а блок цатцх заправо ради са | _+_ | или било коју класу која проширује Тхровабле. Међутим, | _+_ | класа се такође проширује | _+_ | , и никада не желите да ухватите | _+_ | јер | _+_ | с указују на озбиљна непоправљива питања.
  • Никад не хватај | _+_ | ! | _+_ | проширује | _+_ | , дакле сваки блок који хвата | _+_ | такође ће ухватити | _+_ | , а то је веома важан изузетак са којим не желите да се петљате (посебно у апликацијама са више навоја) осим ако не знате шта радите. Ако не знате који бисте изузетак уместо тога ухватили, размислите да ништа не уловите.
  • Користите описне поруке да бисте олакшали отклањање грешака. Када изузмете изузетак, можете навести | _+_ | порука као аргумент. Овој поруци се може приступити у блоку цатцх помоћу | _+_ | метод, али ако се изузетак никада не ухвати, порука ће се појавити и као део праћења стека.
  • Покушајте да не хватате и игноришете изузетке. Да би заобишли непријатности проверених изузетака, многи почетници и лењи програмери ће поставити блок за улов, али га оставити празним. Лоше! Увек пажљиво поступајте, али ако не можете, у најмању руку одштампајте траг стека како бисте знали да је изузетак избачен. То можете учинити помоћу | _+_ | метода.
  • Чувајте се прекомерног коришћења изузетака. Кад имате чекић, све изгледа као ексер. Када први пут сазнате о изузецима, можда ћете се осећати обавезним да све претворите у изузетак ... до тачке у којој се већина контролног тока ваше апликације своди на руковање изузецима. Запамтите, изузеци су намењени за „изузетне“ појаве!

Сада би вам требало бити довољно удобно са изузецима да разумете шта су, зашто се користе и како их уградити у свој код. Ако не разумете у потпуности концепт, то је у реду! Требало ми је неко време да ми 'кликне' у глави, па немојте осећати да морате да журите. Не журите.

Имате ли питања? Знате ли за неке друге савете везане за изузетке које сам пропустио? Поделите их у коментарима испод!

Објави Објави Твеет Емаил Како направити дијаграм тока података за визуализацију података било ког пројекта

Дијаграми протока података (ДФД) било ког процеса помажу вам да разумете како подаци теку од извора до одредишта. Ево како да га креирате!

Прочитајте следеће
Повезане теме
  • Програмирање
  • Јава
О аутору Јоел Лее(Објављено 1524 чланака)

Јоел Лее је главни уредник МакеУсеОф -а од 2018. године. у области рачунарства и преко девет година професионалног искуства у писању и уређивању.

која је апликација за доставу хране најјефтинија
Више од Јоела Лееја

Претплатите се на наш билтен

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

Кликните овде да бисте се претплатили