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