Undantag och IO Fånga exceptions Två kategorier av undantag Mer

Fånga exceptions
int a;
try {
a = b / c;
}
catch (ArithmeticException e) {
a = 9999;
}
Undantag och IO
Lite mer...
123
Två kategorier av undantag
• Checked exceptions
– Fel som vanligtvis inte beror på fel i logiken av
programmet
– Fel som kan uppträda under “normala” förhållanden
– Måste fångas (dvs kod som kan kasta en checked
exception måste skrivas i en try-sats) eller kastas
vidare med metoden, t ex
! IOException
124
Mer om undantag - deklaration
• Exempel:
public static void arraycopy (
Object source, int srcindex,
Object dest, int destindex, int size)
throws ArrayIndexOutOfBoundsException,
ArrayStoreException
• Unchecked exceptions
– Fel som brukar beror på fel i logiken av programmet
– Fel som kan uppträda under “normala” förhållanden
– Får ignoreras (men det är god programmeringsstil att
fånga eller deklarera det), t ex
! ArrayIndexOutOfBoundsException
Försökt spara fel sorts
objekt
125
126
Två kategorier av undantag
Kontrollerade undantag
• Ett undantag är antingen kontrollerat(checked) eller
okontrollerat (unchecked)
• Ett kontrollerat undantag kan endast kastas i ett tryblock eller i en metod som explicit säger att den kastar
detta undantag.
• Kompilatorn kommer att klaga om ett kontrollerat
undantag inte hanteras korrekt.
• Ett okontrollerat undantag kräver ingen särskild
hantering, men kan hanteras på samma sätt.
• Okontrollerade undantag är underklasser till Error
eller RunTimeException. Övriga är kontrollerade.
127
Object
Throwable
Error
Exception
RuntimeException
128
Input/ output
Egna undantag
• Man kan definiera egna undantag genom att
ärva från någon av undantagsklasserna
• Exceptions kastas med hjälp av throwsatsen
• Throw-satsen finns i normala fall i en if-sats
som kollar ifall undantaget skall kastas.
• Java I/O baseras på streams (strömmar)
• En ström är en sekvens av bytes som flödar från en
källa till ett mål
• Fördefinierade standardströmmar:
ström
syfte
System.in
läsa input
System.out skriva output
System.err skriva fel
enhet
tangentbord
bildskärm
bildskärm
• Standard strömmarna kan läggas om med
System.setIn/Out/Err metoderna
129
InputStream
datatyp
InputStream
PrintStream
PrintStream
130
Scanner
• Inputströmmar är mera komplicerade
• InputStream är en abstrakt klass
• InputStream har väldigt begränsad mängd
metoder för att hantera inläsning
• System.in måste därför ofta ”kapslas in” i en
mer specifik ström med de egenskaper man vill ha
– Läsa in strängar
– Läsa in heltal
– Läsa in …
• Vi kommer titta på några olika klasser vi kan
använda till detta tex Scanner
• Osmidigt att läsa in en hel rad som sträng! Bättre
med ett”ord” i taget.
• Vad är ett ”ord”?
• Tecknen måste grupperas till s.k. Tokens
• Tidigare mycket eget jobb
• Sedan Java 1.5 (5.0) finns klassen Scanner...
• Man kopplar en scanner till en ström
Scanner myScan = new Scanner(System.in);
• Finns metoder för att läsa in heltal, flyttal, ord, rader
etc. Se metoder i API:n
131
Input/output
132
Filer
• Externa data kan tillhandahållas på många sätt i
Java :”
– Via GUI”
– Läsas och skrivas direkt till och från tangentbord och
bildskärm
– Läsas och skrivas till och från filer
– Läsas och skrivas till och från databaser
– …
• Filer kan användas för att lagra data
permanent mellan programkörningar eller för
utbyte an information mellan program.
• Textfiler läsbara även för oss (med tex en
texteditor) till skillnad från binära filer som
lagrar datat mer som i datorns minne.
• Java API tillhandahåller paketet java.io
– Klasser som stöder input/output”
– Klasser för att hantera när I/O-operationer går fel
• Typfel
• En fil som inte går att hitta/öppna
• …
133
134
Öppna/Skriva/Stänga
Skriva och läsa textfiler
• Strömmarna betraktas som innehållande värden
av typen char
• Klasser som hanterar textfiler kallas readers och
writers
• Tre viktiga åtgärder
– Öppna filen
– Skriv/läs data
– Stäng filen
• Samtliga dessa kan misslyckas
– Man måste förutse undantag!
135
• Skapa ett FileWriter objekt
• En konstruktor tar filnamnet som parameter
(String)
FileWriter writer = new
FileWriter(”testfil.txt”);
• Skriv med metoden write()
• Överlagrad, tex. med signaturen write(String
str)
writer.write("Första raden\n");
• Stäng filen med metoden close()
writer.close(); //(Obs stäng ej System.in)
136
Koppla ihop strömmar
• För mer avancerat beteende kan de enkla
strömmarna som läser/skriver från någon
kopplas ihop med mer avancerade
strömmar.
• Ex:
PrintWriter out=new PrintWriter(new
FileWriter(“filnamn.txt”));
out.println(“hej”);
out.close();
• Strömmar finns tex för buffring, hantera
radnummer, komprimering och kryptering
137
I/O Streams
Input Streams
Output Streams
Data
Streams
Processing
Streams
Character
Streams
Byte
Streams
139
Läsa från filer
• Scanner har en konstruktor som tar ett Fileobjekt som parameter
• Alternativt kan man koppla ihop den med
En Reader klass
•
File f=new File(“minfil.txt”);
•
Scanner in=new Scanner(f);
//Kastar ett kontrollerat undantag
•
Scanner in2=new Scanner(new FileReader
(“minfil.txt”));
•
String str=in2.next();
•
in2.close();
138