• No results found

Idag. Ett exempel. Undantag. Substitutierbarhet, subtyper, subklasser. När val av metod beror av typerna hos två objekt. Lite om överlagring

N/A
N/A
Protected

Academic year: 2022

Share "Idag. Ett exempel. Undantag. Substitutierbarhet, subtyper, subklasser. När val av metod beror av typerna hos två objekt. Lite om överlagring"

Copied!
47
0
0

Loading.... (view fulltext now)

Full text

(1)

Idag

• Ett exempel

• Undantag

• Substitutierbarhet, subtyper, subklasser

• När val av metod beror av typerna hos två objekt

• Lite om överlagring

(2)

Ett lite större exempel

Ett gränssnitt Shape med metod area().

Circle, Rectangle, Square, Triangle implementerar Shape.

(3)

Exempel, version 2

Notera: för samtliga figurer gäller: arean av en instans ändras aldrig

Idé:

En instansvariabel ’area’. Låt konstruktorn beräkna arean.

(Vi ändrar endast Circle och Rectangle)

(4)

Exempel, version 3

Både Circle och Rectangle har en instansvariabel area och en metod area() med exakt samma definition.

Idé:

Skapa en klass ShapeClass. Låt Circle och Rectangle ärva av denna. Placera det som är gemensamt,

instansvariabeln och metoden area(), här.

(5)

Exempel, version 4

Vi kan plocka bort några av instansvariablerna för Circle och Rectangle:

diameter, side1, side2 Idé:

Skapa en klass ShapeClass. Låt Circle och Rectangle ärva av denna. Placera det som är gemensamt,

instansvariabeln och metoden area(), här.

(6)

Mer ideer

Gör samma sak med Triangle och Square

Låt ShapeClass få en konstruktor med ett argument Då kan instansvariabeln area bli privat

(7)

Olika typer av fel

• Kompileringsfel: programkoden följer inte Javas regler

• Exekveringsfel: fel som uppstår när programmet körs och medför att programmet inte kan fortsätta

exekvera.

Exempel: en fil som ska öppnas saknas, använding av referensvariabel som inte refererar något objekt.

• Logiska fel: programmet gör inte det vi väntade oss Exekveringsfel handlar ofta om problem som ligger

(8)

Undantag

Engelska: exceptions

Skansholm: exceptionella händelser

Fel som genereras om man försöker öppna en fil som inte finns, dividera med noll, indexera utanför en array osv.

(9)

Exempel:

Skriv ett program som 1. ber om ett filnamn 2. öppnar filen

3. läser innehållet

4. gör nåt med innehållet 5. stänger filen

Alla operationer kan gå snett!

(10)

Motivation (forts)

En lösning: skriv uttryckliga tester för alla felsituationer h = open_file(...)

if (h.error) {

// hantera felet } else {

// fortsätt att läsa filen }

Om man ska hantera alla felsituationen blir kontrollflödet komplicerat!

Dessutom: det är svårt att testa koden.

(11)

Exempel

class A {}

class B extends A {}

class Exce2 {

static void main (String [] arg) { A x = new A();

B y = (B)x;

} }

(12)

Exempel, testkörning

$ java Exce2

Exception in thread "main"

java.lang.ClassCastException: A at Exce2.main(Exce2.java:8)

(13)

public class ExceNull {

private void method() {}

public static void main(String[] arg) { ExceNull n = null;

n.method();

} }

harpo$ javac ExceNull.java harpo$ java ExceNull

Exception in thread "main" java.lang.NullPointerException at ExceNull.main(ExceNull.java:7)

(14)

class A {

public int m(int x) { return 100/x;

} }

public class Exce {

public static void main (String[] arg) { int x = Integer.parseInt(arg[0]);

A a = new A();

int z = a.m(x);

System.out.println("100/"+x+" = "+ z);

}}

(15)

Undantag

Frågor om undantag.

• Vilka typer av undantag finns det?

• Hur genereras dem?

• Hur kan man hantera dem?

(16)

Typer av undantag

Ett undantag i Java är ett objekt av någon subklass till klassen java.lang.Throwable.

Undantagen kan delas upp i tre grupper:

• Error (Fel)

• Run-time exception

• Checked exception (Kontrollerade undantag)

(17)

Typer av undantag (forts)

• Error

Fel som vanligtvis inte kan hanteras, tex att maskinen har slut på minne.

• Run-time exception

‘Vanliga programfel’, tex division med noll, fel i

arrayindexering, fel i typkonvertering, eller access av null-objekt.

• Kontrollerade undantag

Fel som rimligtvis bör hanteras av programmet, till

(18)

De viktigaste typerna av undantag

undantag Kontrollerade

....

RunTimeException

....

.... ....

....

Error

Throwable

Exception Object

(19)

Typer av undantag (forts)

• Det finns två viktiga klasser som ärver direkt från Throwable,

• java.lang.Error och java.lang.Exception

• java.lang.Exception har en viktig subklass java.lang.RuntimeException

(20)

Typer av undantag (forts)

Vilket typ av undantag?

Ett undantag tillhör gruppen Error

om det tillhör en klass som ärver från java.lang.Error

Ett undantag tillhör gruppen Run-time Exception om det tillhör en klass som ärver från

java.lang.RuntimeException

Tips: RuntimeException har en konstruktor som tar Throwable som argument. . .

Alla andra undantag tillhör gruppen Checked Exception.

Exempel: IOException

(21)

Att kasta ett undantag

(Generera exceptionella händelser) class Undantag extends Exception {}

class A {

void m() throws Undantag { throw new Undantag();

} }

(22)

Kasta undantag (forts)

• Notera: Vi måste deklarera att metoden m kastar undantag (och vilken typ av undantag).

• Detta gäller för alla kontrollerade undantag (checked exceptions).

• Undantag skapas med new (som alla andra objekt).

(23)

Hantera undantag

En sats

try { ... } catch (U1 e) {

hantera felet }

catch (U1 e) { hantera felet }

finally { avsluta }

evaluerar ... och fångar alla fel av klassen U1 och U2 och avslutar med att “avsluta”

(24)

Exempel: try-catch 2

class Exce6 {

static int div (int x, int y) { int r;

try {

r = x / y;

}

catch (ArithmeticException e) { r = 0;

}

return r;

}

(25)

Exempel: try-catch 2 (forts)

static void main (String [] arg) { int x = Integer.parseInt(arg[0]);

int y = Integer.parseInt(arg[1]);

int z = div(x,y);

System.out.println(z);

} }

(26)

Exempel: try-catch 2 (körexempel)

harpo$ java Exce6

Exception in thread "main"

java.lang.ArrayIndexOutOfBoundsException: 0 at Exce6.main(Exce6.java:13)

harpo$ java Exce6 100 7 14

harpo$ java Exce6 100 0 0

harpo$

(27)

Att passa ett undantag vidare

Vad händer om en metod inte fångar ett kontrollerat undantag?

• För att den saknar en try-sats, eller

• för att try-satsen inte fångar just den typen av undantag.

Undantaget passas vidare till anroparen.

Vilket innebär att anroparen också måste deklarera undantaget.

(28)

Finally

När körs finally-delen?

En try kan terminera på tre olika sätt.

1. { ... } terminerar normalt.

2. { ... } kastar ett undantag som hanteras av en catch-klausul.

3. { ... } kastar ett undantag som inte hanteras.

(29)

När körs finally-delen? (forts) 1. Normal terminering.

Finally-delen körs efter att { ... } terminerat 2. Undantag kastas och hanteras av en catch.

Finally-delen körs efter att hanteraren körts.

3. Undantag kastas men hanteras inte.

Finally-delen körs före undantaget passas vidare.

Finally-delen körs alltid.

Bra för att (tex) stänga filer.

(Men close() kan kasta en IOException som måste

(30)

Undantag, sammanfattning

Alla fel som uppstår vid körning representeras som undantag

Undantag är objekt i någon subklass till Throwable

Undantag kan hanteras (med try-catch) eller deklarertas (med throws)

Vissa undantag (kontrollerade undantag, eller checked exceptions) måste deklareras; om en metod kan kasta ett sådant måste den deklarera det

(31)

Subklasser, subtyper, sustutierbarhet

En klass B ärver av en klass A.

Kan objekt av klassen B användas överallt där objekt av typen A förväntas?

Relation klasser-gränssnitt?

(32)

Substutition

Ersätt ett objekt ur en typ T med ett objekt ur en subtyp T till T.

1. Kompilerar programmet?

2. Kan det köra normalt?

3. Beter det sig “som om” vi arbetade med ett objekt ur supertypen T?

Finns olika definitioner av subtyp. Ibland krävs att att alla 3 ska gälla.

(33)

Brott mot S, exempel

class Person {

String beskriv () {

return "Jag är en person";

} }

class Anställd extends Person { String beskriv () {

return "Jag är en anställd";

}

(34)

Brott mot S, exempel

class Person {

boolean ärAnställd() { return false;

} }

(35)

Brott mot S, exempel

class Anställd extends Person { boolean ärAnställd() {

return true;

} }

(36)

Brott mot S, exempel

class Person {

String getAddress() { ...

} ...

}

class Hemlös extends Person { String getAddress () {

throw new UnsupportedOperationException();

} }

(37)

Brott mot S, exempel

public class PersonTest { void m (Person P) {

if(P instanceof Anställd) {

System.out.println("Den här har ett jobb");

} } }

(38)

Substutitionsprincipen

Substutitionsprincipen: alla tre frågprna med ja besvarade

För att S ska gälla krävs att programmet uppfyller vissa kriterier:

• ingen kod som testar på klasstillhörighet

• arv får aldrig förändra betende

• viss flexibilitet i vad som är betendet hos ett program

(39)

Överlagring (overloading) av konstruktorer En klassdefinition...

class Person { int ålder;

String namn;

[...]

}

(40)

Java tillåter att en klass har flera konstruktorer.

Person (String n, int å) { ålder = å;

namn = n; }

Person(String n) { ålder = 65;

namn = n; } Person (int å) {

ålder = å;

namn = "Nisse"; }

(41)

Person () { ålder = 65;

namn = "Nisse"; }

(42)

Överlagring av konstruktorer: Exempel

Person x;

x = new Person ("Kalle", 42);

System.out.println("Personen "

+ x.namn + " är "

+ x.ålder + " år gammal");

x = new Person (42);

System.out.println("Personen "

+ x.namn + " är "

+ x.ålder + " år gammal");

(43)

Exempel: Överlagring (forts) x = new Person ();

System.out.println("Personen "

+ x.namn + " är "

+ x.ålder + " år gammal");

Körexempel

Personen Kalle är 42 år gammal Personen Nisse är 42 år gammal Personen Nisse är 65 år gammal

(44)

överlagring av metoder class Ut {

static void skriv(String s) {

System.out.println("En sträng:"+ s); } static void skriv(int x) {

System.out.println("Ett heltal:"+ x); } static void skriv(double d) {

System.out.println("Ett flyttal:"+ d); } static void skriv(int [] a) {

(45)

Överlagring av metoder: exempel Ut.skriv(42);

Ut.skriv("eh");

Ut.skriv(3.14);

Ut.skriv( new int[] {5,6,7});

Körexempel:

Ett heltal:42 En sträng:eh Ett flyttal:3.14

En array:[I@73d6a5

(46)

class B {

public void m2(int i) {

System.out.println("B-m2");

} }

class C extends B {

public void m2(char i) {

System.out.println("C-m2");

} }

public class J172 {

public static void main (String[] arg) { B b = new B();

(47)

b.m2(42);

C c = new C();

c.m2(42);

c.m2((char) 42);

} }

harpo$ java J172 B-m2

B-m2

References

Related documents

Då situationerna som socialsekreterarna i våra intervjuer beskriver rör sig inom området för ekonomiskt bistånd, skulle det faktum att föräldrarna, genom att låta sina barn

I den slutliga handläggningen av ärendet har även rättschefen Anna Middelman, enhetschefen Unni Werner, överdirektören Lars Lööw och kvalificerade handläggaren Magnus

Det anförs i promemorian att det blir administrativt krångligt att lämna ersättning från Försäkringskassan till de grupper som inte har rätt till sjuklön, utöver

Sobona kan inte bifalla ett förslag som bygger på att det genom kollektivavtal ska gö- ras avsteg från en av sjuklönelagens huvudprinciper, att sjuklön och karensavdrag ska

ILO-kommittén välkomnar att det i betänkandet görs en redogörelse och analys av förslaget i förhållande till Sveriges internationella åtaganden enligt

Förslaget att införa tidsbegränsad möjlighet att genom kollektivavtal göra undantag från be- stämmelserna om karensavdrag vid särskilda skäl innebär att grundläggande principer om

SKR kan inte bifalla ett förslag som bygger på att det genom kollektivavtal ska göras avsteg från en av sjuklönelagens huvudprinciper, att sjuklön och karensavdrag ska

I promemorian identifieras anställda inom vård- och omsorg som en grupp som kan omfattas av promemorians förslag, men förslaget kan också omfatta andra grupper som i sitt