Assertion Facility - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Java

Assertion Facility

java

6. března 2002, 00.00 | Nově v Javě 2 verze 1.4 Standart Edition se objevuje klíčové slovo assert. Co znamená a k čemu se používá se podíváme právě v tomto článku.

Nově v Javě 2 verze 1.4 Standart Edition se objevuje klíčové slovo assert. Co znamená a k čemu se používá se podíváme právě v tomto článku.

Assertion Facility se uvádí jako pomůcka při programování. Přesněji řečeno při ladění programů. assert vcelku úzce souvisí s výjimkami, kterým jsme se věnovali v předešlých článcích. Možná by se dalo říci, že to vlastně výjimka je. I když taková velmi zvláštní, alespoň co se zápisu týče.

Ale co se týká účelu, tak ten je zhola stejný jako výjimka. Při záporném spuštění aserce se ukončí program (stejně jako u výjimky). A vypíše se AssertionError, případně i text pokud jste ho uvedli.

Mluvil-li jsem zde, že je to vlastní výjimka nebyl jsem daleko od pravdy. Která taková, že se při spuštění aserce se nejdříve vyhodnotí vámi zadaná výjimka. Pokud je false, tak se vyhodí výjimka AssertionError (podtřída třídy Error). Takže je to jak výjimka, tak zároveň podmínka.

Zápis assertion

Podívejme se konečně na to, jak zapisovat assertion. Obecně lze říci, že je lze zapisovat dvěmi následujícími způsoby:

     assert  podmínka;
     assert  podmínka: "text";

V podmínce můžete například hledat nepřijatelnou hodnotu např. null. Assertion se provede pouze vyhodnotí-li se podmínka jako false. V nepovinném textu můžete napsat text, který chcete aby se vypisoval. Prakticky to může vypadat takto:

     assert  0 > myValue;
     assert  firstName != null;
     assert  value != count;
     assert  myMethod(myParameter);

Resp. s textem takto:

     assert  0 > myValue: "hodnota mimo rozsah";
     assert  firstName != null: "Jméno nemůže být prázdné";
     assert  value != count: "hodnota musí být < než count";
     assert  myMethod(myParameter): "method failed";

Z příkladu by mělo být zřejmé, že podmínka musí být typu boolean. Což samozřejmě znamená, že zde nemusí být jen podmínka, ale také např. návratová hodnota nějaké metody.

Pro názorné pochopení bych mohl napsat, jak asi vypadá interpretovaný kód tohoto zápisu. Tím myslím pouze fakt, že většina příkazů, ať již v kterémkoliv jazyce se obvykle dá přepsat do nižší úrovně, dokud nedojdete až k assembleru. Takže vezmeme-li klíčové slovo assert, pak to neznamená nic jiného než zhruba toto:

     assert  podmínka: zpráva;
     
     // resp. =>
     
     if  (!podmínka) {
          throw  AssertionError(zpráva);
     }

Z vlastnosti, že se vyhodí assertion plyne jedna zřejmá vlastnost. To je možnost zachycení výjimky AssertionError pomocí bloku try – catch, kterému jsme se věnovali v druhém článku seriálu. Takže paradoxně lze ošetřit výjimku asi zcela odlišným způsobem než zamýšleli její tvůrci.

// soubor CatchAE.java
public    class   CatchAE
{
     public    static    void    main(String[] args)
     {
          int scitanec1 = 1;
          int scitanec2 = 2;
          int soucet = 0;
          try   {
               soucet = scitanec1 + scitanec2;
               assert  scitanec1 > scitanec2;
          }
          catch   (AssertionError e) {
               e.printStackTrace();
          }
          System.out.println("Můj první součet");
          System.out.println("Součet: " +soucet);
     }
}

Z toho je asi názorně vidět, že ve vlastních metodách či třídách nemusíme mít deklarovány vlastní výjimky, ale často si vystačíme s tomto. Beru-li v úvahu takovou výjimku, která slouží pouze k interním účelům, tedy nepředává se nadřazené metodě apod.

Ještě lepším než jen zachycením s pozdějším ukončením programu je výjimku zpracovat o trochu jinak. Program pak není ukončen a běží dál — pouze vypisuje chybová kódy o assertion. Otázkou je zda je to vhodné v daném případě.

// soubor CatchAE2.java
public    class   CatchAE2
{
     public    static    void    printAssertionError(AssertionError ae) {
          StackTraceElement[] stackTraceElements = ae.getStackTrace();
          StackTraceElement stackTraceElement = stackTraceElements[0];
          System.err.println("AssertionError");
          System.err.println("   class=   " +stackTraceElement.getClassName());
          System.err.println("   method=  " +stackTraceElement.getMethodName());
          System.err.println("   message= " +ae.getMessage() );
     }

     public    static    void    main(String[] args) {
          int scitanec1 = 1;
          int scitanec2 = 2;
          int soucet = 0;
          try   {
               soucet = scitanec1 + scitanec2;
               assert  scitanec1 > scitanec2;
          }
          catch   (AssertionError ae) {
               printAssertionError(ae);
          }
          System.out.println("Můj první součet");
          System.out.println("Součet: " +soucet);
     }
}

Tak a to je pro dnešek vše. Příště si dokončíme Assertion Facility, což znamená podíváme se kompilaci a spuštění, zpětnou kompatibilitu s verzí 1.3. Mimo to se také podíváme na podmíněný překlad v Javě, který bude potřebovat.

Zde zmíněné příklady si můžete stáhnout v souboru assert.zip (3 kB).

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Java  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: