Undantagshantering Fördjupad Java 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. 1 2 Fel Undantag Felmeddelanden, Errors, betecknar ofta ett allvarligare fel som inte kan åtgärdas och kastas vanligen av JVM. Ex. OutOfMemoryError. 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. 3 4 Fånga Undantag Grupper av 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. System.out.println(Integer.parseString(numString)); catch (NumberFormatException exception) { System.out.println("String is not a number"); 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. catch (NumberFormatException e) { catch (Exception e) { 5 6 1
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 { 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(); 7 8 Egna undantag finally Det går att skapa egna undantag genom arv public class MyProgramScrewedUpException extends RuntimeException { public MyProgramScrewedUpException() { super(); public MyProgramScrewedUpException(String msg) { super(msg); Finally används när man 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.) Måste stå tillsammans med try-catch. public void method() { catch(exception e) { finally { state = 1; 9 10 Strömmar Bitströ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. All bitströmmar är härledda från InputStream -- ström för läsning. OutputStream -- ström för skrivning. 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 12 2
Bitströmmar Teckenströmmar Några vanliga bitsträmmar är: FileInputStream Teckenströmmar är härledda från: Reader BufferedInputStream ObjectInputStream ström för läsning. Writer och motsvarande för OutputStream och dessutom PrintStream. ström för skrivning. Några vanliga teckenströmmar är: FileReader, BufferedReader, och motsvarande för Writer och dessutom PrintWriter. 13 14 Undantag Ö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 De flesta filhanteringsmetoder kastar undantag som måste hanteras. Alla är de av typen IOException, t.ex. FileNotFoundException. // och koppla den till filströmmen. BufferedWriter bw = new BufferedWriter(fw); FileWriter fw = new FileWriter("MinFil.txt"); // En anpassad ström för skriving är: PrintWriter pw = new PrintWriter(bw); catch(filenotfoundexception e) { // Skriv till filen. pw.println("innehåll i min första Java-fil"); // Stäng filen pw.close(); System.err.println("Filen kunde inte öppnas"); catch(ioexception e) { System.err.println(Det uppstod ett fel); e.printstacktrace(); 15 16 in, out, err Koppla bit- och teckenströmmar System finns färdiga strömmar. InputStreamReader isr = System.in new InputStreamReader(System.in); Läsning från tangentbord (InputStream). BufferedReader stdin = System.out new BufferedReader(isr); Skrivning till skärm (PrintStream). System.err String s = stdin.readline(); Skrivning av felmeddelanden. (PrintStream). 17 18 3
Gränssnitt Gemensamma egenskaper hos objekt utan arv. : 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. 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() { 19 20 forts. Serialisering av Objekt Rollable weal = new Weal(); Rollable ball = new Ball(); ball.roll(); weal.roll(); 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. 21 22 public class Data implements Serializable { Inre klasser public int value1; public float value2; Kan skapa klasser inom klasser. Klassen enbart åtkomlig via sin moderklass. FileOutputStream fs = new FileOutputStream("Datafil.dat"); Praktiskt för skydd av internt data. 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 24 4
Fortsättning public class List { protected class ListItem { public ListItem next = null; public ListItem previous = null; public void addbefore(object value) { ListItem item = new ListItem(value); if (isempty()) { current = item; else { public Object value = null; item.previous = current.previous; public ListItem(Object value) { this.value = value; item.next = current; if (current.privious!= null) current.previous.next = item; current.previous = item; protected ListItem current = null; protected int index = 0; protected int length = 0; index++; length++; 25 26 5