Programmēšana

Kā izmantot apgalvojumus Java

Rakstīt programmas, kas darbojas pareizi izpildlaikā, var būt sarežģīta. Tas ir tāpēc, ka mūsu pieņēmumi par to, kā kods darbosies izpildot, bieži ir nepareizi. Java apgalvojumu funkcijas izmantošana ir viens no veidiem, kā pārbaudīt, vai jūsu programmēšanas loģika ir pareiza.

Šī apmācība iepazīstina ar Java apgalvojumiem. Vispirms jūs uzzināsiet, kādi ir apgalvojumi, kā tos norādīt un izmantot kodā. Pēc tam jūs uzzināsiet, kā izmantot apgalvojumus, lai izpildītu priekšnosacījumus un pēcnosacījumus. Visbeidzot, jūs salīdzināsiet apgalvojumus ar izņēmumiem un uzzināsiet, kāpēc kodā ir nepieciešami abi.

lejupielādēt Iegūt kodu Lejupielādējiet šīs apmācības piemēru avota kodu. Izveidoja Jeff Friesen JavaWorld.

Kādi ir Java apgalvojumi?

Pirms JDK 1.4 izstrādātāji bieži izmantoja komentārus, lai dokumentētu pieņēmumus par programmas pareizību. Komentāri tomēr ir bezjēdzīgi kā pieņēmumu pārbaudes un atkļūdošanas mehānisms. Sastādītājs ignorē komentārus, tāpēc tos nav iespējams izmantot kļūdu noteikšanai. Izstrādātāji arī bieži neatjaunina komentārus, mainot kodu.

JDK 1.4 apgalvojumi tika ieviesti kā jauns mehānisms, lai pārbaudītu un atkļūdotu pieņēmumus par mūsu kodu. Būtībā, apgalvojumi ir kompilējamas entītijas, kas tiek izpildītas izpildes laikā, pieņemot, ka esat iespējojis tās programmu testēšanai. Varat ieprogrammēt apgalvojumus, lai paziņotu jums par kļūdām vietās, kur rodas kļūdas, ievērojami samazinot laiku, ko jūs citādi pavadītu kļūdainas programmas atkļūdošanai.

Apgalvojumi tiek izmantoti, lai kodificētu prasības, kas testēšanas laikā padara programmu pareizu vai nē nosacījumiem (Būla izteiksmes) par patiesām vērtībām un paziņot izstrādātājam, ja šādi apstākļi ir nepatiesi. Apgalvojumu izmantošana var ievērojami palielināt jūsu pārliecību par koda pareizību.

Kā uzrakstīt apgalvojumu Java valodā

Apgalvojumi tiek īstenoti, izmantojot apgalvot paziņojums un java.lang.AssertionError klasē. Šis paziņojums sākas ar atslēgvārdu apgalvot un turpina ar Būla izteiksmi. To sintaktiski izsaka šādi:

apgalvot Būla izteiksme;

Ja Būla izteiksme novērtē patiesību, nekas nenotiek un izpilde turpinās. Tomēr, ja izteiksme ir nepatiesa, AssertionError tiek instancēts un izmests, kā parādīts 1. sarakstā.

1. saraksts:AssertDemo.java (1. versija)

public class AssertDemo {public static void main (String [] args) {int x = -1; apgalvot x> = 0; }}

Apsvars 1. sarakstā norāda izstrādātāja pārliecību par šo mainīgo x satur vērtību, kas ir lielāka vai vienāda ar 0. Tomēr tas acīmredzami nav tas gadījums; apgalvot izpildes rezultātā tiek izmests AssertionError.

Sastādīt 1. sarakstu (javac AssertDemo.java) un palaidiet to ar iespējotiem apgalvojumiem (java -ea AssertDemo). Jums jāievēro šāda izeja:

Izņēmums pavedienā "main" java.lang.AssertionError at AssertDemo.main (AssertDemo.java:6)

Šis ziņojums ir nedaudz noslēpumains, jo nenosaka, kas to izraisīja AssertionError jāmet. Ja vēlaties informatīvāku ziņojumu, izmantojiet apgalvot paziņojums, kas izteikts zemāk:

apgalvot Būla izteiksme : izteikt;

Šeit, izteikt ir jebkura izteiksme (ieskaitot metodes izsaukumu), kas var atgriezt vērtību - jūs nevarat izsaukt metodi ar a spēkā neesošs atgriešanās veids. Noderīga izteiksme ir virknes burtnīca, kas apraksta neveiksmes cēloni, kā parādīts 2. sarakstā.

2. saraksts:AssertDemo.java (2. versija)

public class AssertDemo {public static void main (String [] args) {int x = -1; apgalvot x> = 0: "x <0"; }}

Apkopot 2. sarakstu (javac AssertDemo.java) un palaidiet to ar iespējotiem apgalvojumiem (java -ea AssertDemo). Šoreiz jums jāievēro šāda nedaudz paplašināta izeja, kas ietver iemestā iemeslu AssertionError:

Izņēmums pavedienā "main" java.lang.AssertionError: x <0 vietnē AssertDemo.main (AssertDemo.java:6)

Jebkuram piemēram, skriešana AssertDemo bez -ea (iespējot apgalvojumus) opcija nerada izvadi. Ja apgalvojumi nav iespējoti, tie netiek izpildīti, lai gan tie joprojām atrodas klases failā.

Priekšnoteikumi un pēcnosacījumi

Apgalvojumi pārbauda programmas pieņēmumus, pārbaudot, vai netiek pārkāpti tās dažādi priekšnosacījumi un pēcnosacījumi, brīdinot izstrādātāju par pārkāpumu:

  • A priekšnoteikums ir nosacījums, kas jānovērtē kā true, pirms tiek izpildīta kāda koda secība. Priekšnosacījumi nodrošina, ka zvanītāji saglabā līgumus ar zvaniem.
  • A pēcnosacījums ir nosacījums, kas jānovērtē kā patiess pēc kādas koda secības izpildes. Pēcnosacījumi nodrošina, ka sarunu biedri saglabā līgumus ar zvanītājiem.

Priekšnoteikumi

Jūs varat ieviest priekšnoteikumus publiskajiem konstruktoriem un metodēm, veicot skaidras pārbaudes un veicot izņēmumus, ja nepieciešams. Privāto palīgu metodēm varat ieviest priekšnoteikumus, norādot apgalvojumus. Apsveriet iespēju norādīt 3. sarakstu.

3. saraksts:AssertDemo.java (3. versija)

importēt java.io.FileInputStream; importēt java.io.InputStream; importēt java.io.IOException; klases PNG {/ ** * Izveidojiet PNG gadījumu, izlasiet norādīto PNG failu un atšifrējiet * to piemērotās struktūrās. * * @param filespec ceļš un lasāmā PNG faila nosaukums * * @throws NullPointerException, kad faila specifikācija ir * nulle * / PNG (String filespec) izmet IOException {// Izpildīt priekšnoteikumus privātiem konstruktoriem un // metodēm. if (filespec == null) mest jaunu NullPointerException ("filespec is null"); mēģiniet (FileInputStream fis = new FileInputStream (filespec)) {readHeader (fis); }} private void readHeader (InputStream is) izmet IOException {// Pārbaudiet, vai privāto // palīgu metodēs ir izpildīts priekšnoteikums. apgalvot ir! = null: "null nodots ir"; }} public class AssertDemo {public static void main (String [] args) izmet IOException {PNG png = new PNG ((args.length == 0)? null: args [0]); }}

The PNG klase 3. sarakstā ir minimālais bibliotēkas sākums PNG (portatīvās tīkla grafikas) attēlu failu lasīšanai un dekodēšanai. Konstruktors skaidri salīdzina faila specifikācija ar nulle, mešana NullPointerException kad šis parametrs satur nulle. Punkts ir izpildīt priekšnoteikumu, kas faila specifikācija nesatur nulle.

Nav pareizi norādīt apgalvot filespec! = null; jo priekšnoteikums, kas minēts konstruktora Javadoc, netiktu (tehniski) ievērots, ja apgalvojumi būtu atspējoti. (Patiesībā tas būtu pagodināts, jo FileInputStream () iemestu NullPointerException, taču nevajadzētu būt atkarīgam no nedokumentētas uzvedības.)

Tomēr apgalvot ir piemērots privātā kontekstā readHeader () palīga metode, kas galu galā tiks pabeigta, lai lasītu un atšifrētu PNG faila 8 baitu galveni. Priekšnoteikums, ka ir vienmēr tiks nodota vērtība, kas vienmēr būs nulle.

Pēcnosacījumi

Pēcnosacījumus parasti nosaka, izmantojot apgalvojumus, neatkarīgi no tā, vai metode (vai konstruktors) ir publiska. Apsveriet 4. sarakstu.

4. saraksts:AssertDemo.java (4. versija)

public class AssertDemo {public static void main (String [] args) {int [] masīvs = {20, 91, -6, 16, 0, 7, 51, 42, 3, 1}; kārtot (masīvs); for (int elements: masīvs) System.out.printf ("% d", elements); System.out.println (); } private static boolean isSorted (int [] x) {for (int i = 0; i x [i + 1]) atgriež false; atgriezties taisnība; } privāta statiska tukšuma šķirošana (int [] x) {int j, a; // Visām veselu skaitļu vērtībām, izņemot kreisāko vērtību ... ((int i = 1; i 0 && x [j - 1]> a) {// Shift left value - x [j - 1] - viena pozīcija labajā pusē - // x [j]. x [j] = x [j - 1]; // Atjaunināt ievietošanas pozīciju uz novirzītās vērtības sākotnējo pozīciju // (viena pozīcija pa kreisi). j--; } // ievietojiet a ievietošanas pozīcijā (kas ir vai nu sākotnējā ievietošanas // pozīcija, vai pēdējā ievietošanas pozīcija), kur a ir lielāka par // vai vienāda ar visām vērtībām pa kreisi. x [j] = a; } apgalvot isSorted (x): "masīvs nav sakārtots"; }}

4. sarakstā ir a kārtot () palīga metode, kas izmanto ievietošanas kārtojums algoritms, lai kārtotu veselu skaitļu vērtību masīvu. Esmu izmantojis apgalvot lai pārbaudītu x tiek šķiroti iepriekš kārtot () atgriežas pie sava zvanītāja.

4. saraksta piemērs parāda svarīgu apgalvojumu raksturojumu, proti, to izpilde parasti ir dārga. Šī iemesla dēļ apgalvojumi ražošanas kodā parasti tiek atspējoti. 4. sarakstā isSorted () jāpārbauda viss masīvs, kas var būt laikietilpīgs gara masīva gadījumā.

Apgalvojumi pret Java izņēmumiem

Izstrādātāji izmanto apgalvojumus, lai dokumentētu loģiski neiespējamas situācijas un noteiktu kļūdas viņu programmēšanas loģikā. Izpildes laikā iespējots apgalvojums brīdina izstrādātāju par loģisko kļūdu. Izstrādātājs pārveido avota kodu, lai novērstu loģikas kļūdu, un pēc tam kompilē šo kodu.

Izstrādātāji izmanto Java izņēmuma mehānismu, lai reaģētu uz neiznīcinošām (piem., Atmiņas beigām) izpildlaika kļūdām, kuras var izraisīt vides faktori, piemēram, fails neeksistē, vai slikti uzrakstīts kods, piemēram, mēģinājums sadalīt ar 0. Izņēmumu apstrādātājs bieži tiek rakstīts, lai graciozi atkoptos no kļūdas, lai programma varētu turpināt darboties.

Apgalvojumi neaizstāj izņēmumus. Atšķirībā no izņēmumiem apgalvojumi neatbalsta kļūdu atkopšanu (apgalvojumi parasti nekavējoties aptur programmas izpildi -AssertionError nav paredzēts noķert); ražošanas kodā tie bieži tiek atspējoti; un parasti tie neparāda lietotājam draudzīgus kļūdu ziņojumus (lai gan tas nav jautājums apgalvot). Ir svarīgi zināt, kad izmantot izņēmumus, nevis apgalvojumus.

Kad izmantot izņēmumus

Pieņemsim, ka esat uzrakstījis sqrt () metode, kas aprēķina argumenta kvadrātsakni. Nesarežģītu skaitļu kontekstā nav iespējams iegūt negatīvā skaitļa kvadrātsakni. Tāpēc, ja arguments ir negatīvs, jūs izmantojat apgalvojumu, lai metode neizdotos. Apsveriet šādu koda fragmentu:

public double sqrt (double x) {apgalvot x> = 0: "x ir negatīvs"; // ...}

Nav pareizi izmantot apgalvojumu, lai apstiprinātu argumentu publiski metodi. Apgalvojums ir paredzēts, lai atklātu kļūdas programmēšanas loģikā, nevis lai aizsargātu metodi no kļūdainiem argumentiem. Turklāt, ja apgalvojumi tiek atspējoti, nav iespējas tikt galā ar negatīva argumenta problēmu. Labāk ir mest izņēmumu šādi:

public double sqrt (double x) {if (x <0) mest jaunu IllegalArgumentException ("x ir negatīvs"); // ...}

Izstrādātājs var izvēlēties, lai programma rīkojas ar nelegālo argumentu izņēmumu, vai vienkārši izplata to no programmas, kur rīks, kas palaiž programmu, parāda kļūdas ziņojumu. Izlasot kļūdas ziņojumu, izstrādātājs var novērst jebkuru kodu, kas noveda pie izņēmuma.

Jūs, iespējams, pamanījāt izsmalcinātu atšķirību starp apgalvojumu un kļūdu noteikšanas loģiku. Apgalvojuma testi x> = 0, turpretī kļūdu noteikšanas loģikas testi x <0. Apgalvojums ir optimistisks: mēs pieņemam, ka arguments ir pareizs. Turpretī kļūdu noteikšanas loģika ir pesimistiska: mēs pieņemam, ka arguments nav labs. Apgalvojumi dokumentē pareizu loģiku, turpretī izņēmumi - nepareizu izpildlaika uzvedību.

Šajā apmācībā jūs uzzinājāt, kā izmantot apgalvojumus, lai dokumentētu pareizu programmas loģiku. Jūs esat arī uzzinājis, kāpēc apgalvojumi neaizstāj izņēmumus, un esat redzējuši piemēru, kurā izņēmuma izmantošana būtu efektīvāka.

Šo stāstu "Kā izmantot apgalvojumus Java" sākotnēji publicēja JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found