predavanje08

Download Report

Transcript predavanje08

RP3/predavanje08
 Ugniježdeni tipovi
 Iznimke
02/05/2020
---------- Računarski praktikum 3 ---------Maja Starčević
1
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.
02/05/2020
Računarski praktikum 3
2
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;
02/05/2020
Računarski praktikum 3
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; }
}
}
class Inner
{
int b;
Outer o = new Outer( );
Outer.Inner oo = new Outer.Inner( );
public Inner( ) { b = o.a; }
}
02/05/2020
Računarski praktikum 3
4
Ugniježdeni tipovi
class Outer
{
int a;
class Inner
{
int b;
Outer o=new Outer( );
public Inner( ) { b = o.a; }
}
}
class Inner
{
int b;
Outer o = new Outer( );
Outer.Inner oo = new Outer.Inner( );
public Inner( ) { b = o.a; }
}
02/05/2020
// klasa Outer.Inner ima private pristup
// klasa nije ugniježdena u klasi Outer
Računarski praktikum 3
5
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.
02/05/2020
Računarski praktikum 3
6
Iznimke
static void Main( )
{
try
{
int x=1, y=0;
Console.WriteLine (x / y);
}
catch (DivideByZeroException e)
{
Console.WriteLine(“Dijeljenje s nulom!”);
}
}
02/05/2020
Računarski praktikum 3
7
Iznimke
try
{
.......
}
catch (ExceptionA e)
{
........
}
catch (ExceptionB e)
{
........
}
finally
{
............
}
02/05/2020
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.
Računarski praktikum 3
8
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
{
…….
}
02/05/2020
Računarski praktikum 3
9
Iznimke
ArgumentException
MulticastNotSupportedException
ArgumentNullException
NotFiniteNumberException
ArithmeticException
NotSupportedException
ArrayTypeMismatchException
NullReferenceException
DivideByZeroException
OutOfMemoryException
FormatException
OverFlowException
IndexOutOfRangeException
StackOverFlowException
InvalidCastExeption
TypeInitializationException
MemberAccessException
02/05/2020
Računarski praktikum 3
10
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
02/05/2020
Računarski praktikum 3
11
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
02/05/2020
Računarski praktikum 3
……..
12
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)
{
Console.WriteLine(e.ToString( ));
}
catch (Exception e)
{
Console.WriteLine(e.ToString( ));
}
// specijaliziraniji tip iznimke se stavlja u prvi
// catch blok
}
02/05/2020
Računarski praktikum 3
13
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
{
Console.WriteLine(e.ToString( ));
}
}
02/05/2020
Računarski praktikum 3
14
Iznimke
Primjer 5:
catch (System.DivideByZeroException)
{
Console.WriteLine("DivideByZeroException!");
}
catch (System.ArithmeticException)
{
Console.WriteLine("ArithmeticException!");
}
catch (Exception e)
{
Console.WriteLine("Log: " + e.ToString());
}
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));
}
02/05/2020
}
public double Podijeli(double a, double b)
{
if (b==0)
throw new System.DivideByZeroException( );
if (a==0)
throw new System.ArithmeticException( );
return a/b;
}
}
Računarski praktikum 3
15
Iznimke
Primjer 6:
static void Main(string[] args)
{
class Program
{
try
{
static void f()
{
f();
}
catch (Exception e) //hvatanje iznimke
{
Console.WriteLine("Uhvatio iznimku u
funkciji Main:");
Console.WriteLine(e.ToString());
}
finally
{
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
Console.WriteLine("Finally u funkciji Main");
} // finally blok se izvršava
}
}
}
02/05/2020
Računarski praktikum 3
16
Iznimke
Primjer 6:
class Program
{
static void Main(string[] args)
{
static void f()
{
try
{
f();
}
catch (Exception e) // ponovno hvatanje
{
Console.WriteLine("Uhvatio iznimku u
funkciji Main:");
Console.WriteLine(e.ToString());
}
finally
{
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
Console.WriteLine("Finally u funkciji Main");
} // finally blok se izvršava
}
}
}
02/05/2020
Računarski praktikum 3
17