• No results found

Objectorienterad programmering Sida 1 Undantag och IO Sven-Olof Nyström Exempel: Skriv ett program som 1

N/A
N/A
Protected

Academic year: 2021

Share "Objectorienterad programmering Sida 1 Undantag och IO Sven-Olof Nyström Exempel: Skriv ett program som 1"

Copied!
10
0
0

Loading.... (view fulltext now)

Full text

(1)

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.

Objectorienterad programmering Sida 1

Undantag och IO Sven-Olof Nyström

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!

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.

Objectorienterad programmering Sida 3

Undantag och IO Sven-Olof Nyström

Exempel

class A {}

class B extends A {}

class Exce2 {

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

B y = (B)x;

} }

(2)

Exempel, testkörning

$ java Exce2

Exception in thread "main"

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

Objectorienterad programmering Sida 5

Undantag och IO Sven-Olof Nyström

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)

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);

}}

Objectorienterad programmering Sida 7

Undantag och IO Sven-Olof Nyström

Undantag

Frågor om undantag.

Vilka typer av undantag finns det?

Hur genereras dem?

Hur kan man hantera dem?

(3)

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)

Objectorienterad programmering Sida 9

Undantag och IO Sven-Olof Nyström

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 exempel försök att öppna en fil som inte finns.

De viktigaste typerna av undantag

undantag Kontrollerade

....

RunTimeException

....

.... ....

....

Error Throwable

Exception Object

Objectorienterad programmering Sida 11

Undantag och IO Sven-Olof Nyström

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

(4)

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

Objectorienterad programmering Sida 13

Undantag och IO Sven-Olof Nyström

Att kasta ett undantag

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

class A {

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

} }

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).

Objectorienterad programmering Sida 15

Undantag och IO Sven-Olof Nyström

Hantera undantag

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”

(5)

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;

}

Objectorienterad programmering Sida 17

Undantag och IO Sven-Olof Nyström

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);

} }

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$

Objectorienterad programmering Sida 19

Undantag och IO Sven-Olof Nyström

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.

(6)

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.

Objectorienterad programmering Sida 21

Undantag och IO Sven-Olof Nyström

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 fångas. . .)

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

Objectorienterad programmering Sida 23

Undantag och IO Sven-Olof Nyström

Strömmar och IO

Strömmar InputStream OutputStream

Läser och skriver strömmar av bytes.

Reader Writer

Läser och skriver strömmar av char (Unicode).

(7)

Klassen InputStream, några metoder

int read() läser en byte (-1 om strömmen slut) int read(byte[] buffer) läser bytes in i en buffer

long skip(long n) skippar (högst)nbyte, returnera hur många void close () stäng strömmen

Objectorienterad programmering Sida 25

Undantag och IO Sven-Olof Nyström

Klassen Reader

int read() läser ett tecken

int read(char[] buffer) läser in tecken i en buffer long skip(long n) skippar (högst) n tecken.

void close () stäng strömmen

Klassen OutputStream

void flush() tömmer alla buffrar och ser till att utskriften når sitt mål void close() stänger strömmen void write(int b) skriver en byte

void write(byte [] b) skriver en array av bytes

Objectorienterad programmering Sida 27

Undantag och IO Sven-Olof Nyström

Exempel

Inläsning från terminalfönster Utskrift till fil

Läs in fil. . .

1. med InputStream 2. med Reader 3. med try-catch

4. med BufferedReader

(8)

Definiera egna filter

Exempel: FilterReader

(Finns motsvarande för de antra tre typerna av strömmar)

En abstrakt klass,

ärver Reader

En konstruktor, som tar Reader som argument

Objectorienterad programmering Sida 29

Undantag och IO Sven-Olof Nyström

Egna filter (forts)

En “protected” instansvariabel in (den ström som filtreras)

samma metoder som Reader

För att konvertera från stora till små bokstäver räcker det om man definierar ett filter som överskuggar (overrides) metoderna för läsning.

ToLowerCaseReader.java, UpperToLower.java

Andra filter

BufferedReader(Reader in) BufferedWriter(Writer out) LineNumberReader(Reader in) PushbackReader(Reader in)

Objectorienterad programmering Sida 31

Undantag och IO Sven-Olof Nyström

Andra strömmar

DataInputStream(InputStream is)

Läser olika datatyper, tex readBoolean() readChar() readInt()

DataOutputStream(OutputStream is) Skriver primitiva datatyper, tex writeBoolean(boolean b),

writeChar(char c), writeInt(int i)

new PipedInputStream()

new PipedOutputStream(PipedInputStream p) kopplar ihop två strömmar

(9)

Andra strömmar (forts)

ObjectInputStream(InputStream in) Läser godtyckliga objekt!

ObjectOutputStream(OutputStream in) Skriver godtyckliga objekt!

Objectorienterad programmering Sida 33

Undantag och IO Sven-Olof Nyström

Serialisering

Klasserna ObjectInputStream och ObjectOutputStream kan användas för att läsa och skriva (nästan) vilka objekt som helst.

Operationer:

void writeObject(Object o) skriver ett objekt

Object readObject() läser ett objekt

Serialisering (forts)

Krav: readObject och writeObject kräver att objektet tillhör en klass som implementerar interfacet Serializable Om in och out är av klasserna InputStream och

OutputStream, skriv

ObjectInputStream sin = new ObjectInputStream(in);

ObjectOutputStream sout = new ObjectOutputStream(out);

för att skapa strömmar som kan läsa och skriva objekt.

Exempel:

SeriTest1.java, SeriTest2.java

Objectorienterad programmering Sida 35

Undantag och IO Sven-Olof Nyström

Lite om Unicode

Plattformsoberoende

Mål: kunna koda alla världens språk (inklusive utdöda)

en char är 16 bitar (= 65536 tecken). Nån som tror att det räcker?

(10)

Unicode (forts)

Unicode kan representera mer än en miljon tecken

• ⇒ minsta datatypen i Java som kodar alla tecken är int.

För att slippa använda 32 bitar för varje tecken använder man olika avkodningar (encodings), tex

UTF-8, UTF-16, UTF-16BE, UTF16LE, UTF-32

Dessa kodar unicode till en sekvens av bytes, 16-bitars ord eller 32-bitars ord.

Objectorienterad programmering Sida 37

Undantag och IO Sven-Olof Nyström

Unicode (forts)

Det finns också ofullständiga avkodningar.

Java-system kan generera utskrift till följande format:

US-ASCII och ISO-8859-1.

Under Unix är ISO-8859-1 default.

Genom optionen -encoding kan man även styra vilken kodning kompilatorn använder.

(Exempel)

Unitest, provkörning

harpo$ java5 Unitest får us-ascii [66, 3f, 72]

harpo$ java5 Unitest får iso-8859-1 [66, e5, 72]

harpo$ java5 Unitest får utf-8 [66, c3, a5, 72]

harpo$ java5 Unitest får utf-16 [fe, ff, 0, 66, 0, e5, 0, 72]

harpo$ java5 Unitest får utf-16le [66, 0, e5, 0, 72, 0]

harpo$ java5 Unitest får utf-32

Exception in thread "main" java.io.UnsupportedEncodingException: utf-32

Objectorienterad programmering Sida 39

References

Related documents

Skulle laget eller spelarna/spelaren vara försenad mer än 30 minuter till matchstart kommer laget automatiskt dra på sig ett gult kort samt lämna WO i den aktuella matchen

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

(a) Typ av fördelning: Låt η vara antal kast tills napp f.f.g., en geometrisk fördel- ning med parameter p = 0.2.. (c) Sannolikheten att få

Det konsekvensanalysen avser att belysa är därför en utebliven möjlighet till besparing (lägre kapital- kostnad på grund av att bankerna skulle kunna välja att minska sin kapitalbas)

namnen i runinskrifterna är namn på byar eller gårdar. I dessa fall kan man genomgående räkna.. med både namn- och

[r]

Risk finns att patent inte beviljas på patentsökta uppfinningar, att beviljade patent inte ger tillräckligt patentskydd eller att beviljade patent kringgås eller upphävs. Det

Bolagets aktier har tidigare inte varit föremål för offentlig handel vilket gör det svårt att förutse vilket intresse Bolagets aktie kommer att få. Vid ett svagt intresse