---------- Računarski praktikum 3 ---------- RP3/predavanje08 Ugniježdeni tipovi Iznimke 10/11/2018 ---------- Računarski praktikum 3 ---------- Maja Starčević
Ugniježdeni tipovi Za ugniježdene (engl. nested) tipove vrijede sljedeća pravila: Mogu pristupati svim članovima tipa koji ih sadrži (pa i privatnima). Mogu imati bilo koji modifikator pristupa. Default vidljivost je private. Svi korisnički definirani tipovi mogu biti ugniježdeni, odnosno ugnijezditi se mogu klase, strukture, enumeracije, delegati, sučelja Samo klase i strukture mogu sadržavati ugniježdene tipove. 10/11/2018 Računarski praktikum 3
Ugniježdeni tipovi public class Proizvod { private class Sastav { ... } public enum Boja { Crna, Smedja, Plava }; } U prethodnom primjeru su klasa Sastav i enumeracija Boja ugniježdeni tipovi. Pozivanje izvan klase Proizvod: Proizvod.Boja boja=Proizvod.Boja.Plava; 10/11/2018 Računarski praktikum 3
Ugniježdeni tipovi Zadatak: pronađite greške u kodu: class Outer { int a; class Inner int b; Outer o=new Outer( ); public Inner( ) { b = o.a; } } Outer o = new Outer( ); Outer.Inner oo = new Outer.Inner( ); 10/11/2018 Računarski praktikum 3
Ugniježdeni tipovi class Outer { int a; class Inner int b; Outer o=new Outer( ); public Inner( ) { b = o.a; } } Outer o = new Outer( ); Outer.Inner oo = new Outer.Inner( ); // klasa Outer.Inner ima private pristup public Inner( ) { b = o.a; } // klasa nije ugniježdena u klasi Outer 10/11/2018 Računarski praktikum 3
Iznimke Try/catch blok je primarni mehanizam za rukovanje iznimkama. Omogućuje razdvajanje rukovanja pogreškom od normalnog toka algoritma. Ako u try dijelu tog bloka postoji pogreška, prosljeđuje se catch dijelu bloka. Pogreška koja uzrokuje skok programskog toka u catch blok zove se iznimka. Finally blok provodi potrebno čišćenje prije zatvaranja programa. 10/11/2018 Računarski praktikum 3
Iznimke static void Main( ) { try int x=1, y=0; Console.WriteLine (x / y); } catch (DivideByZeroException e) Console.WriteLine(“Dijeljenje s nulom!”); 10/11/2018 Računarski praktikum 3
Iznimke try { ....... } catch (ExceptionA e) ........ catch (ExceptionB e) finally ............ Tip iznimke mora biti System.Exception ili klasa izvedena iz System.Exception Napomena: Try blok treba doći uvijek u kombinaciji s catch, finally ili catch i finally blokom. 10/11/2018 Računarski praktikum 3
Iznimke Ukoliko želimo uhvatiti iznimku bilo kojeg tipa, možemo pisati catch blok u obliku catch (Exception e) { ……. } ili, ako nam nije potrebna referenca na iznimku, jednostavnije kao catch { ……. } 10/11/2018 Računarski praktikum 3
Iznimke ArgumentException MulticastNotSupportedException ArgumentNullException NotFiniteNumberException ArithmeticException NotSupportedException ArrayTypeMismatchException NullReferenceException DivideByZeroException OutOfMemoryException FormatException OverFlowException IndexOutOfRangeException StackOverFlowException InvalidCastExeption TypeInitializationException MemberAccessException 10/11/2018 Računarski praktikum 3
Iznimke Primjer 1: static void Main(string[] args) { try throw new ArgumentNullException(); } catch(ArgumentException e) Console.WriteLine("Uhvatio ArgumentException iznimku"); finally Console.WriteLine("U finally bloku"); // Uhvatio ArgumentException iznimku U finally bloku 10/11/2018 Računarski praktikum 3
Iznimke Primjer 2: static void Main(string[] args) { try throw new ArgumentException(); } catch(ArgumentNullException e) Console.WriteLine("Uhvatio ArgumentException iznimku"); finally Console.WriteLine("U finally bloku"); // Unhandled Exception : System. ArgumentException …….. U finally bloku 10/11/2018 Računarski praktikum 3
Iznimke Primjer 3: static void Main(string[ ] args) { int a = 2, b = 0; try if (b == 0) throw new DivideByZeroException( ); int c=a/b ; } catch (DivideByZeroException e) // specijaliziraniji tip iznimke se stavlja u prvi { // catch blok Console.WriteLine(e.ToString( )); catch (Exception e) 10/11/2018 Računarski praktikum 3
Iznimke Primjer 4: static void Main(string[ ] args) { int a = 2, b = 0; try if (b == 0) throw new DivideByZeroException( ); int c=a/b ; } catch (Exception e) Console.WriteLine(e.ToString( )); catch (DivideByZeroException e) // error, catch blok ne može teoretski uhvatiti iznimku 10/11/2018 Računarski praktikum 3
Iznimke Primjer 5: catch (System.DivideByZeroException) class Program { static void Main(string[] args) Program p = new Program(); p.Funkcija( ); } public void Funkcija() try double a = 2; double b = 0; Console.WriteLine(Podijeli(a, b)); catch (System.DivideByZeroException) { Console.WriteLine("DivideByZeroException!"); } catch (System.ArithmeticException) Console.WriteLine("ArithmeticException!"); catch (Exception e) Console.WriteLine("Log: " + e.ToString()); public double Podijeli(double a, double b) if (b==0) throw new System.DivideByZeroException( ); if (a==0) throw new System.ArithmeticException( ); return a/b; 10/11/2018 Računarski praktikum 3
Iznimke static void Main(string[] args) class Program Primjer 6: { { static void f() try throw new OverflowException(); } catch (NullReferenceException e) Console.WriteLine("Uhvatio iznimku u funkciji f:"); Console.WriteLine(e.ToString()); finally Console.WriteLine("Finally u funkciji f"); } // finally blok se izvršava static void Main(string[] args) { try f(); } catch (Exception e) //hvatanje iznimke Console.WriteLine("Uhvatio iznimku u funkciji Main:"); Console.WriteLine(e.ToString()); finally Console.WriteLine("Finally u funkciji Main"); } // finally blok se izvršava Primjer 6: 10/11/2018 Računarski praktikum 3
Iznimke class Program static void Main(string[] args) Primjer 6: { { static void f() try throw new OverflowException(); } catch (OverflowException e) // hvatanje iznimke Console.WriteLine("Uhvatio iznimku u funkciji f:"); Console.WriteLine(e.ToString()); throw; // ponovno izbacivanje finally Console.WriteLine("Finally u funkciji f"); } // finally blok se izvršava static void Main(string[] args) { try f(); } catch (Exception e) // ponovno hvatanje Console.WriteLine("Uhvatio iznimku u funkciji Main:"); Console.WriteLine(e.ToString()); finally Console.WriteLine("Finally u funkciji Main"); } // finally blok se izvršava Primjer 6: 10/11/2018 Računarski praktikum 3