Fördjupad Java 1 Undantagshantering Ett undantag (Exception) är ett objekt som påtalar en ovanlig eller felaktig situation i ett program. Undantag kastas av programmet och kan fångas och hanteras. Java har en färdig mängd uppsättning undantag, bl.a. NullPointerException och IndexOutOfBoundsException. 2 Fel Felmeddelanden, Errors, betecknar ofta ett allvarligare fel som inte kan åtgärdas och kastas vanligen av JVM och bör inte fångas. Ex. OutOfMemoryError. 3 1
Undantag Undantag kan hanteras på tre sätt: Hantera dem där de inträffar. Hantera dem i en annan del av programmet. Strunta i dem (undantaget tas då hand om VM och programmet avslutas efter att undantaget skrivits ut på skärmen). Rekommenderas ej. 4 Fånga Undantag Undantag fångas med en try-catch-sats. try-block måste följas av ett catch-block. Enbart angivet undantag fångas av catch. Flera catch-block kan anges efter ett try-block. try { System.out.println(Integer.parseString(numString)); catch (NumberFormatException exception) { System.out.println("String is not a number"); 5 Grupper av Undantag Alla undantag har ärvt klassen Exception. Utnyttjas för att fånga generella undantag. Undantag som ärvt RuntimeException, måste inte fångas (ex. NullPointerException), medan de övriga måste fångas. try { catch (NumberFormatException e) { catch (Exception e) { 6 2
Skicka vidare undantag En metod kan välja att skicka ett undantag vidare. Detta anges då i metodhuvudet med throws. Flera undantag kan anges i throws. public void openlogfile() throws FileNotFoundException { 7 Kasta undantag Man kan kasta undantag med throw. Observera att IllegalArgumentException är ett RuntimeExeption och inte behöver fångas. public Object getlistvalue(int index) { if (index < 0 index > length) throw new IllegalArgumentException(); 8 Egna undantag Det går att skapa egna undantag genom arv. Egna hierarkier av undantag kan skapas på detta sätt. public class MyProgramScrewedUpException extends RuntimeException { public MyProgramScrewedUpException() { super(); public MyProgramScrewedUpException(String msg) { super(msg); 9 3
finally Vill man vara säker på att något skall utföras innan man lämnar en metod (t.ex. stänga en fil, sätta ett tillstånd etc.) göras med ett finally-block. Måste stå tillsammans med try-catch. public void method() { try { catch(exception e) { finally { state = 1; 10 Strömmar Filhantering, utskrifter, inläsning m.m. hanteras i Java med s.k. strömmar (streams). Strömmar kan kopplas ihop som kedjor för att anpassa funktionaliteten efter sina egna behov. Finns två klasser av strömmar: bitströmmar -- Ström för i huvudsak binärt data. teckenströmmar -- Ström för tecken och textsträngar. 11 Bitströmmar All bitströmmar är härledda från InputStream -- ström för läsning. OutputStream -- ström för skrivning. 12 4
Bitströmmar Några vanliga bitsträmmar är: FileInputStream BufferedInputStream ObjectInputStream och motsvarande för OutputStream och dessutom PrintStream. 13 Teckenströmmar Teckenströmmar är härledda från: Reader ström för läsning. Writer ström för skrivning. Några vanliga teckenströmmar är: FileReader, BufferedReader, och motsvarande för Writer och dessutom PrintWriter. 14 Exempel Öppna en textfil och skriva text till den. // Öppna filen och skapa en ström till den. FileWriter fw = new FileWriter("MinFil.txt"); // För effektivitet använd en buffrad ström // och koppla den till filströmmen. BufferedWriter bw = new BufferedWriter(fw); // En anpassad ström för skriving är: PrintWriter pw = new PrintWriter(bw); // Skriv till filen. pw.println("innehåll i min första Java-fil"); // Stäng filen pw.close(); 15 5
Undantag De flesta filhanteringsmetoder kastar undantag som måste hanteras. Alla är de av typen IOException, t.ex. FileNotFoundException. try { FileWriter fw = new FileWriter("MinFil.txt"); catch(filenotfoundexception e) { System.err.println("Filen kunde inte öppnas"); catch(ioexception e) { System.err.println(Det uppstod ett fel); e.printstacktrace(); 16 in, out, err System finns färdiga strömmar. System.in Läsning från tangentbord (InputStream). System.out Skrivning till skärm (PrintStream). System.err Skrivning av felmeddelanden. (PrintStream). 17 Koppla bit- och teckenströmmar InputStreamReader isr = new InputStreamReader(System.in); BufferedReader stdin = new BufferedReader(isr); String s = stdin.readline(); 18 6
Gränssnitt Gemensamma egenskaper hos objekt utan arv. Exempel: En boll och ett hjul kan båda rulla, men har inga andra gemensamma egenskaper. En boll ''är en'' leksak och ett hjul ''är en'' bildel. Gränssnitt garanterar funktionalitet hos objekt. Används enbart till metoder. Ingen kod finns i gränssnitt, enbart prototyper. Skapas med interface och används med implements. 19 Exempel public interface Rollable { public void roll(); public class Ball implements Rollable extends Toy { public void roll() { public class Weal implements Rollabel extends Carpart { public void roll() { 20 Exempel forts. Rollable weal = new Weal(); Rollable ball = new Ball(); ball.roll(); weal.roll(); 21 7
Serialisering av Objekt Objekt kan serialiseras för att skrivas och läsas över strömmar. Vid serialisering översätts objektet till information (namn, värden på attribut m.m.) som sedan kan användas för att återskapa objektet. Objekt som skall serialiseras implementerar gränssnittet Serializable. Om objektet är ett aggregat måste även attributen ha implementerat Serializable. 22 Exempel public class Data implements Serializable { public int value1; public float value2; FileOutputStream fs = new FileOutputStream("Datafil.dat"); ObjectOutputStream os = new ObjectOutputStream(fs); Data[] data = new Data[2]; data[0] = new Data(3, -0.2); data[1] = new Data(2, 5.3); os.writeint(data.length); os.writeobject(data[0]); os.writeobject(data[1]); 23 Inre klasser Kan skapa klasser inom klasser. Klassen enbart åtkomlig via sin moderklass. Praktiskt för skydd av internt data. 24 8
Exempel public class List { protected class ListItem { public ListItem next = null; public ListItem previous = null; public Object value = null; public ListItem(Object value) { this.value = value; protected ListItem current = null; protected int index = 0; protected int length = 0; 25 Fortsättning public void addbefore(object value) { ListItem item = new ListItem(value); if (isempty()) { current = item; else { item.previous = current.previous; item.next = current; if (current.privious!= null) current.previous.next = item; current.previous = item; index++; length++; 26 9