Kā pareizi rīkoties ar Java izņēmumiem

Kā pareizi rīkoties ar Java izņēmumiem

Kā programmēšanas iesācējs, jēdziens izņēmumu apstrāde var būt grūti apvīt galvu. Ne tas, ka pats jēdziens ir grūts, bet terminoloģija var likt tam izskatīties daudz attīstītākam, nekā tas ir. Un tā ir tik spēcīga iezīme, ka tā ir pakļauta ļaunprātīgai un ļaunprātīgai izmantošanai.





Šajā rakstā jūs uzzināsit, kādi ir izņēmumi, kāpēc tie ir svarīgi, kā tos izmantot un bieži sastopamās kļūdas, no kurām jāizvairās. Lielākajai daļai mūsdienu valodu ir sava veida izņēmumu apstrāde, tādēļ, ja jūs kādreiz pārejat no Java, varat ņemt līdzi lielāko daļu šo padomu.





Java izņēmumu izpratne

Java, an izņēmums ir objekts, kas norāda, ka jūsu lietojumprogrammas izpildes laikā radās kaut kas neparasts (vai “ārkārtējs”). Šādi izņēmumi ir izmests , kas būtībā nozīmē, ka tiek izveidots izņēmuma objekts (līdzīgi tam, kā tiek “paaugstinātas” kļūdas).





Skaistums ir tas, ka jūs varat noķert izņēmumi, kas ļauj tikt galā ar neparastu stāvokli un ļaut jūsu lietojumprogrammai turpināt darboties tā, it kā nekas nebūtu nogājis greizi. Piemēram, ja nulles rādītājs C var sabojāt jūsu lietojumprogrammu, Java ļauj mest un noķert

NullPointerException

s pirms nulles mainīgajam ir iespēja izraisīt avāriju.



Atcerieties, ka izņēmums ir tikai objekts, bet ar vienu svarīgu īpašību: tas ir jāpagarina no

Exception

klase vai jebkura apakšklase





Exception

. Lai gan Java ir visu veidu iebūvēti izņēmumi, ja vēlaties, varat izveidot arī savus. Daži no Visizplatītākie Java izņēmumi ietver:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Tātad, kas notiek, ja izmetat izņēmumu?





Pirmkārt, Java meklē tūlītējo metodi, lai noskaidrotu, vai ir kods, kas apstrādā jūsu izņēmuma veidu. Ja apstrādātājs neeksistē, tas aplūko metodi, kas sauca par pašreizējo metodi, lai noskaidrotu, vai tur ir rokturis. Ja nē, tā aplūko izsaukto metodi ka metode, un tad nākamā metode utt. Ja izņēmums netiek uztverts, lietojumprogramma izdrukā kaudzes pēdas un pēc tam avarē. (Patiesībā tas ir vairāk niansēts nekā vienkārši avārija, bet šī ir tēma, kas pārsniedz šī raksta darbības jomu.)

TO kaudzes izsekošana ir saraksts ar visām metodēm, kuras Java veica, meklējot izņēmumu apstrādātāju. Lūk, kā izskatās kaudzes izsekošana:

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)

No tā mēs varam daudz ko smelties. Pirmkārt, izmestais izņēmums bija a

NullPointerException

. Tas notika gadā

getTitle()

metode Book.java 16. rindā. Šī metode tika izsaukta no

getBookTitles()

Author.java 25. rindā. Tas metode tika izsaukta no

main()

Bootstrap.java 14. rindā. Kā redzat, to visu zinot, ir vieglāk atkļūdot.

Bet atkal patiesais izņēmumu ieguvums ir tas, ka jūs varat “tikt galā” ar neparastu stāvokli, noķerot izņēmumu, sakārtojot lietas un atsākot lietotni bez avārijas.

Java izņēmumu izmantošana kodā

Pieņemsim, ka jums ir

someMethod()

kas ņem veselu skaitli un izpilda kādu loģiku, kas varētu izjaukt, ja vesels skaitlis ir mazāks par 0 vai lielāks par 100. Šī varētu būt laba vieta, kur izlikt izņēmumu:

instalējiet Play veikalu ugunsdrošības planšetdatorā
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

Lai noķertu šo izņēmumu, jums jādodas uz kurieni

someMethod()

tiek saukts un izmantojiet mēģiniet noķert bloku :

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

Viss, kas atrodas pamēģini bloks tiks izpildīts kārtībā, līdz tiks izmests izņēmums. Tiklīdz tiek izmests izņēmums, visi nākamie paziņojumi tiek izlaisti un lietojumprogrammas loģika nekavējoties pāriet uz noķert bloķēt.

Mūsu piemērā mēs ievadām mēģinājuma bloku un nekavējoties zvanām

someMethod()

. Tā kā 200 nav no 0 līdz 100, an

IllegalArgumentException

tiek izmests. Tas nekavējoties beidz izpildi

someMethod()

, izlaiž pārējo loģiku mēģinājuma blokā (

someOtherMethod()

nekad netiek izsaukts) un atsāk izpildi nozvejas blokā.

Kas notiktu, ja mēs piezvanītu

someMethod(50)

tā vietā? The

IllegalArgumentException

nekad netiktu izmests.

someMethod()

izpildītu kā parasti. Izmēģinājuma bloks darbotos kā parasti, zvanot

someOtherMethod()

kad someMethod () ir pabeigts. Kad

someOtherMethod()

beidzas, nozvejas bloks tiktu izlaists un

callingMethod()

turpinātu.

Ņemiet vērā, ka vienā mēģinājuma blokā var būt vairāki bloķēšanas bloki:

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

Ņemiet vērā arī to, ka pēc izvēles beidzot pastāv arī bloks:

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

Galīgā bloka kods ir vienmēr izpildīts neatkarīgi no tā. Ja mēģinājuma blokā ir atgriešanās paziņojums, pēdējais bloks tiek izpildīts pirms atgriešanās no metodes. Ja nozvejas blokā iemetat vēl vienu izņēmumu, pēdējais bloks tiek izpildīts pirms izņēmuma iemetiena.

Jums vajadzētu izmantot galīgo bloku, ja jums ir objekti, kas jātīra pirms metodes beigām. Piemēram, ja mēģinājuma blokā atvērāt failu un vēlāk iemetāt izņēmumu, pēdējais bloks ļauj aizvērt failu pirms metodes atstāšanas.

Ņemiet vērā, ka beidzot varat izveidot bloķēšanu bez bloķēšanas bloka:

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

Tas ļauj veikt visu nepieciešamo tīrīšanu, vienlaikus ļaujot izņēmumiem izplatīt metodes izsaukšanas kaudzīti (t.i., šeit nevēlaties apstrādāt izņēmumu, bet vispirms tomēr ir jātīra).

Pārbaudīti un neatzīmēti Java izņēmumi

Atšķirībā no vairuma valodu Java atšķir atšķirības pārbaudīja izņēmumus un nekontrolēti izņēmumi (piemēram, C# ir tikai nepārbaudīti izņēmumi). Pārbaudīts izņēmums jābūt tikt pieķertam metodē, kurā tiek izmests izņēmums, pretējā gadījumā kods netiks apkopots.

Lai izveidotu atzīmētu izņēmumu, pagariniet no

Exception

. Lai izveidotu nepārbaudītu izņēmumu, pagariniet no

RuntimeException

.

Jebkurai metodei, kas rada atzīmētu izņēmumu, tas ir jānorāda metodes parakstā, izmantojot met atslēgvārds. Tā kā Java ir iebūvēta

IOException

ir atzīmēts izņēmums, šāds kods netiks apkopots:

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

Vispirms jums jāpaziņo, ka tas rada pārbaudītu izņēmumu:

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

Ņemiet vērā, ka metodi var pasludināt par izņēmuma izmešanu, bet patiesībā nekad neizraisīt izņēmumu. Tomēr izņēmums joprojām būs jānoķer, pretējā gadījumā kods netiks apkopots.

Kad jāizmanto pārbaudīti vai neatzīmēti izņēmumi?

Oficiālajā Java dokumentācijā ir lapā par šo jautājumu . Tā apkopo atšķirību ar kodolīgu īkšķa noteikumu: “Ja var pamatoti sagaidīt, ka klients atgūsies no izņēmuma, padariet to par pārbaudītu izņēmumu. Ja klients nevar darīt neko, lai atgūtu no izņēmuma, padariet to par nepārbaudītu izņēmumu. ”

Bet šī vadlīnija var būt novecojusi. No vienas puses, pārbaudītie izņēmumi rada stabilāku kodu. No otras puses, neviena cita valoda nav pārbaudījusi izņēmumus tādā pašā veidā kā Java, kas parāda divas lietas: pirmkārt, šī funkcija nav pietiekami noderīga, lai citas valodas to nozagtu, un divas - jūs varat pilnīgi iztikt bez tām. Turklāt pārbaudītie izņēmumi nespēlē labi ar lambda izteiksmēm, kas ieviestas Java 8.

Vadlīnijas Java izņēmumu lietošanai

Izņēmumi ir noderīgi, taču tos var viegli un ļaunprātīgi izmantot. Šeit ir daži padomi un paraugprakse, kas palīdzēs izvairīties no to sajaukšanas.

  • Dodiet priekšroku konkrētiem izņēmumiem, nevis vispārējiem izņēmumiem. Izmantojiet | _+_ | vairāk nekā | _+_ | ja iespējams, citādi izmantojiet | _+_ | vairāk nekā | _+_ | kad iespējams.
  • Nekad neķer | _+_ | ! | _+_ | klase faktiski paplašinās | _+_ | , un nozvejas bloks faktiski darbojas ar | _+_ | vai jebkura klase, kas paplašina Throwable. Tomēr | _+_ | klase arī paplašinās | _+_ | , un jūs nekad nevēlaties noķert | _+_ | jo | _+_ | norāda uz nopietnām neatgriezeniskām problēmām.
  • Nekad neķer | _+_ | ! | _+_ | paplašina | _+_ | , tātad jebkurš bloks, kas aizķer | _+_ | noķers arī | _+_ | , un tas ir ļoti svarīgs izņēmums, ar kuru jūs nevēlaties sajaukt (īpaši daudzpavedienu lietojumprogrammās), ja vien nezināt, ko darāt. Ja jūs nezināt, kuru izņēmumu noķert, apsveriet iespēju neko neķert.
  • Izmantojiet aprakstošus ziņojumus, lai atvieglotu atkļūdošanu. Izmetot izņēmumu, varat norādīt | _+_ | ziņu kā argumentu. Šim ziņojumam var piekļūt nozvejas blokā, izmantojot | _+_ | metodi, bet, ja izņēmums nekad netiek uztverts, ziņojums parādīsies arī kā steka izsekošanas daļa.
  • Centieties neķert un ignorēt izņēmumus. Lai izvairītos no pārbaudīto izņēmumu neērtībām, daudzi iesācēji un slinki programmētāji izveidos nozvejas bloku, bet atstās to tukšu. Slikti! Vienmēr rīkojieties graciozi, bet, ja nevarat, vismaz izdrukājiet kaudzes pēdas, lai zinātu, ka izņēmums tika izmests. To var izdarīt, izmantojot | _+_ | metode.
  • Sargieties no pārmērīgiem izņēmumiem. Kad jums ir āmurs, viss izskatās kā nagla. Kad jūs pirmo reizi uzzināsit par izņēmumiem, jums var šķist pienākums visu pārvērst par izņēmumu ... līdz vietai, kur lielākā daļa jūsu lietojumprogrammas vadības plūsmas ir saistīta ar izņēmumu apstrādi. Atcerieties, ka izņēmumi ir domāti “ārkārtas” gadījumiem!

Tagad jums vajadzētu būt pietiekami ērtam ar izņēmumiem, lai saprastu, kas tie ir, kāpēc tie tiek izmantoti un kā tos iekļaut savā kodā. Ja jūs pilnībā nesaprotat jēdzienu, tas ir labi! Pagāja kāds laiks, līdz tas “noklikšķināja” manā galvā, tāpēc nejūties, ka tev tas būtu jāsteidzina. Nesteidzies.

Vai jums ir kādi jautājumi? Vai zināt citus padomus, kas saistīti ar izņēmumiem? Kopīgojiet tos komentāros zemāk!

Kopīgot Kopīgot Čivināt E -pasts Kā izveidot datu plūsmas diagrammu, lai vizualizētu jebkura projekta datus

Jebkura procesa datu plūsmas diagrammas (DFD) palīdz saprast, kā dati plūst no avota līdz galamērķim. Lūk, kā to izveidot!

Lasīt Tālāk
Saistītās tēmas
  • Programmēšana
  • Java
Par autoru Džoels Lī(Publicēti 1524 raksti)

Džoels Lī ir MakeUseOf galvenais redaktors kopš 2018. gada. Viņam ir B.S. datorzinātnēs un vairāk nekā deviņu gadu profesionāla rakstīšanas un rediģēšanas pieredze.

īpaši ātrs hdmi kabelis 48gbps
Vairāk no Džoela Lī

Abonējiet mūsu biļetenu

Pievienojieties mūsu informatīvajam izdevumam, lai iegūtu tehniskus padomus, pārskatus, bezmaksas e -grāmatas un ekskluzīvus piedāvājumus!

Noklikšķiniet šeit, lai abonētu