F10 - Exceptions. ID1004 Objektorienterad programmering Fredrik Kilander

Relevanta dokument
Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Föreläsnings 9 - Exceptions, I/O

Fördjupad Java. Undantagshantering. Fel

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

OOP Objekt-orienterad programmering

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Språkkonventioner och redigering av tal.

Att skriva till och läsa från terminalfönstret

Föreläsning 14. Filhantering

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Objektorienterad Programmering (TDDC77)

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Testning och felhantering

Objektorienterad programmering

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Input. Programmering. Andra källor

Recitation 4. 2-D arrays. Exceptions

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Testning av program. Verklig modell för programutveckling

Lösningar för tenta 2 DAT043,

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

F3: Recursive descent, tokenisering, avbildningar och undantag. Carl Nettelblad

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Felhantering. Andra brott mot språkets regler. Man kan också i programmet bryta mot ett antal olika regler som gäller. Exempelvis:

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3-4 Innehåll

Klassen javax.swing.timer

OOP Objekt-orienterad programmering

JAVAUTVECKLING LEKTION 7

Felhantering TDDD78, TDDE30, 729A

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Översikt. Skriva och läsa data. Kontrollflöde. Två sorters loopar. For-loop. For-loop

F4. programmeringsteknik och Matlab

Lösningsförslag, tentamen FYTA11 Javaprogrammering

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Föreläsning 3. Stack

Dagens föreläsning. Sett i datorsalarna. Mer om arrayer. Matriser. Formatering av utskrifter. Inläsning med hjälp av Scanner-klassen

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

OOP Objekt-orienterad programmering

Tentamen OOP

Hämta data mha URLer Föreläsning 2b. Innehåll Klassen URL

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Surfning. Webbklienter och webbservrar. Specialskrivna webbservrar. Kommunikation med sockets

Lösningsförslag till tentamen

OOP Objekt-orienterad programmering

Tentamen , Introduktion till Java, dtaa98, dtea53

Objektorienterad Programmering (TDDC77)

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

Objektorienterad Programmering (TDDC77)

OOP Objekt-orienterad programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag till tentamen

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Parallellism, återblick

Föreläsning 6: Undantag, filhantering samt flera användbara klasser

TENTAMEN OOP

DAT043 Objektorienterad Programmering

Chapter 4: Writing Classes/ Att skriva egna klasser.

Outline. Objektorienterad Programmering (TDDC77) Lösningen heter Collection. Collection gränsnittet. Collection. Iterable. Ahmed Rezine.

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Del A (obligatorisk för alla)

Tentamen FYTA11 Javaprogrammering

Dagens föreläsning. Sett i datorsalarna. Mer om arrayer. Matriser. Formatering av utskrifter. Inläsning med hjälp av Scanner-klassen

Föreläsning 14. Träd och filhantering

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Skriftlig tentamen för kursen DV017A. Inledande programmering i Java A

Del A (obligatorisk för alla)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Sammanfattning och repetition utgående från typiska tentamensuppgifter

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tentamen , Grundläggande programmering i Java

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Transkript:

F10 - Exceptions ID1004 Objektorienterad programmering Fredrik Kilander fki@kth.se

Exception! Exception in thread "main" java.lang.arithmeticexception: / by zero at ExceptionDemo.methodB(ExceptionDemo.java:5) at ExceptionDemo.methodA(ExceptionDemo.java:10) at ExceptionDemo.kör(ExceptionDemo.java:14) at ExceptionDemo.main(ExceptionDemo.java:21)

Exception! public class ExceptionDemo { private void methodb() { int n = 123 / 0; System.out.println(n); private void methoda() { methodb(); Exception in thread "main" java.lang.arithmeticexception: / by zero at ExceptionDemo.methodB(ExceptionDemo.java:5) at ExceptionDemo.methodA(ExceptionDemo.java:10) at ExceptionDemo.kör(ExceptionDemo.java:14) at ExceptionDemo.main(ExceptionDemo.java:21) public void kör() { methoda(); /** * @param args */ public static void main(string[] args) { new ExceptionDemo().kör();

main startar Exceptions main() Exception in thread "main" java.lang.arithmeticexception: / by zero at ExceptionDemo.methodB(ExceptionDemo.java:5) at ExceptionDemo.methodA(ExceptionDemo.java:10) at ExceptionDemo.kör(ExceptionDemo.java:14) at ExceptionDemo.main(ExceptionDemo.java:21) kör() metoda() metodb() exception

Exceptions (undantag) En exception är ett objekt En exception kastas uppåt längs anropsstacken när ett fel inträffar Om en exception når ut ur metoden main utan att fångas avslutas programmet

Exempel på orsaker Division med noll Arrayindexering utanför arrayen En fil kunde inte hittas En I/O-operation kunde inte slutföras normalt Programmet försökte referera null Programmet försökte bryta mot säkerhetspolicyn

Exempel public class Example10_1 { public static void main(string [] args) { String s = null; int length = s.length(); >java Example10_1 Exception in thread "main" java.lang.nullpointerexception at Example10_1.main(Example10_1.java:4) >

Exempel public class Example10_2 { public static void main(string [] args) { int d = 99; int n = 0; System.out.println(d/n); >java Example10_2 Exception in thread "main" java.lang.arithmeticexception: / by zero at Example10_2.main(Example10_2.java:5) >

Exempel public class Example10_3 { private int badcalc(int d, int n){ return d/n; public static void main(string [] args) { System.out.println(new Example10_3().badCalc(99, 0)); >java Example10_3 Exception in thread "main" java.lang.arithmeticexception: / by zero at Example10_3.badCalc(Example10_3.java:3) at Example10_3.main(Example10_3.java:6) >

Vanligt anrop public int[] loadagearray(inputstream in){ Scanner scan = new Scanner(in); // Läs in och lägg i en ny array public static void main(string[] args){ int [] ages = loadagearray(system.in); double m = average(ages);... return ar; System.out.println( Avg age: + m); public double average(int [] nums){ double sum = 0d; for (int n : nums) { sum += n; double avg = sum / nums.length; nums = [10, 20, 30] nums.length == 3 return avg;

Vanligt anrop public int[] loadagearray(inputstream in){ Scanner scan = new Scanner(in); // Läs in och lägg i en ny array public static void main(string[] args){ int [] ages = loadagearray(system.in); double m = average(ages);... return ar; System.out.println( Avg age: + m); public double average(int [] nums){ double sum = 0d; for (int n : nums) { sum += n; double avg = sum / nums.length; nums = [10, 20, 30] nums.length == 3 return avg;

Vanligt anrop ArithmeticException public int[] loadagearray(inputstream in){ Scanner scan = new Scanner(in); // Läs in och lägg i en ny array public static void main(string[] args){ int [] ages = loadagearray(system.in); double m = average(ages);... return ar; System.out.println( Avg age: + m); public double average(int [] nums){ double sum = 0d; for (int n : nums) { sum += n; double avg = sum / nums.length; /0 nums = [] nums.length == 0 return avg;

Hantera exceptions Vissa typer av exceptions kan förutses Designern kan välja att för var och en: inte hantera denna exception hantera den där den kan kastas hantera den högre upp i anropskedjan

Exception! public class ExceptionDemo { private void methodb() { int n = 123 / 0; System.out.println(n); private void methoda() { methodb(); public void kör() { try { methoda(); catch (ArithmeticException aex) { /** * @param args */ public static void main(string[] args) { new ExceptionDemo().kör();

main startar Exceptions main() fångad kör() metoda() metodb() exception

Fånga exceptions med try-catch try { Exakt 1 try-klausul Oftast minst en catch finally utelämnas ofta /* kod som kan kasta exceptions */ catch ( exceptionklass variabel ){ /* hantera en eller flera exceptions */ finally { /* kod här utförs alltid, oavsett om en exception kastades eller ej */

Fånga exceptions med try-catch try { Exakt 1 try-klausul Oftast minst en catch finally utelämnas ofta int n = s.length(); catch (NullpointerException npx){ npx.printstacktrace(); finally { /* kod här utförs alltid, oavsett om en exception kastades eller ej */

Fånga exceptions med try-catch Datasource database =...; Connection myconnection = null; try { myconnection = dabatase.getconnection(myname, mypassword); // Prata med databasen... catch (SQLException sqx){ System.err.println(sqx.getMessage()); finally { if (myconnection!= null) { myconnection.close();

Exceptions är ordnade i klasser Exceptions kan fångas av program som vill hantera dem java.lang.exception java.lang.runtimeexception java.lang.object java.lang.throwable java.io.ioexception java.lang.error Errors är allvarliga fel och ska normalt inte fångas java.io.ioerror java.lang.arithmeticexception java.io.filenotfoundexception java.lang.virtualmachineerror java.lang.nullpointerexception UnsupportedEncodingException java.lang.internalerror java.lang.illegalargumentexception java.io.unknownhostexception java.lang.outofmemoryerror

catch med klass på rätt nivå try { catch (java.lang.exception ex) { // fångar alla exceptions java.lang.exception try { catch (java.io.ioexception iox) { // fångar alla IO-exceptions java.io.ioexception try { catch (java.io.filenotfoundexception fnx) { // fångar FileNotFoundException java.io.filenotfoundexception

Händiga metoder i en exception String getmessage() kort beskrivning printstacktrace() skriver ut hela spåret på standard error try { FileReader fr = new FileReader( Names.txt ); // Read names from file fr.close(); catch (java.io.filenotfoundexception fnx) { System.out.println ( Oops, + fnx.getmessage());

try-catch example: getmessage() public class Example10_4 { private int badcalc(int d, int n){ return d/n; public static void main(string [] args) { Example10_4 ex = new Example10_4(); try { ex.badcalc(99, 0); catch (ArithmeticException arx) { System.out.println("Message is " + arx.getmessage()); >java Example10_4 Message is / by zero >

try-catch example: printstacktrace() public class Example10_5 { private int badcalc(int d, int n){ return d/n; public static void main(string [] args) { Example10_5 ex = new Example10_5(); try { ex.badcalc(99, 0); catch (ArithmeticException arx) { arx.printstacktrace(); >java Example10_5 java.lang.arithmeticexception: / by zero at Example10_5.badCalc(Example10_5.java:3) at Example10_5.main(Example10_5.java:8) >

Måste man fånga exceptions? Nej, inte om det är ok att programmet avbryts Men: en metod kan deklarera att den kastar en eller flera exceptions Om man anropar en sådan metod måste man antingen fånga dem, eller deklarara att de kan komma att kastas Detta gäller inte RuntimeException och dess underklasser

java.util.scanner.nextint() nextint public int nextint() Scans the next token of the input as an int. An invocation of this method of the form nextint() behaves in exactly the same way as the invocation nextint(radix), where radix is the default radix of this scanner. Returns: the int scanned from the input Throws: InputMismatchException - if the next token does not match the Integer regular expression, or is out of range NoSuchElementException - if input is exhausted IllegalStateException - if this scanner is closed Dessa tre är subklasser till java.lang.runtimeexception. De behöver inte fångas eller deklareras som kastbara. Men det är tillåtet att göra bägge.

Läsa tal med felhantering Scanner scan = new Scanner(System.in); int num; boolean done = false; while (!done) { try { System.out.print( Ange längd: ); num = scan.nextint(); done = true; catch (InputMismatchException imx) { scan.nextline(); System.out.println( Skriv ett tal );

Exception propagation Det är inte alltid självklart på vilken nivå en exception hanteras bäst Förutsägbara fel bör hanteras där de kan åtgärdas Mindre förutsägbara fel kanske inte ska fångas alls (det kan dölja buggar)

Vanligt anrop public int[] loadagearray(file in) throws FileNotFoundException { Scanner scan = new Scanner(in); public static void main(string[] args){ File infile = new File(args[0]); int [] ages = loadagearray(infile); double m = average(ages); // Läs in och lägg i en ny array... return ar; System.out.println( Avg age: + m); public double average(int [] nums){ double sum = 0d; for (int n : nums) { sum += n; double avg = sum / nums.length; return avg;

Vanligt anrop public int[] loadagearray(file in) throws FileNotFoundException { Scanner scan = new Scanner(in); public static void main(string[] args){ File infile = new File(args[0]); int [] ages = loadagearray(infile); double m = average(ages); // Läs in och lägg i en ny array... return ar; System.out.println( Avg age: + m); public double average(int [] nums){ double sum = 0d; loadagearray kastar FileNotFoundException Detta får inte ignoreras i main. for (int n : nums) { sum += n; double avg = sum / nums.length; return avg;

Vanligt anrop public int[] loadagearray(file in) throws FileNotFoundException { Scanner scan = new Scanner(in); public static void main(string[] args) throws FileNotFoundException { File infile = new File(args[0]); int [] ages = loadagearray(infile); // Läs in och lägg i en ny array... return ar; double m = average(ages); System.out.println( Avg age: + m); public double average(int [] nums){ double sum = 0d; loadagearray kastar FileNotFoundException Detta får inte ignoreras i main Deklarera i main också for (int n : nums) { sum += n; double avg = sum / nums.length; return avg;

Vanligt anrop ArrayIndexOutOfBoundsException public int[] loadagearray(file in) throws FileNotFoundException { Scanner scan = new Scanner(in); public static void main(string[] args) throws FileNotFoundException { File infile = new File(args[0]); int [] ages = loadagearray(infile); // Läs in och lägg i en ny array... return ar; double m = average(ages); System.out.println( Avg age: + m); public double average(int [] nums){ double sum = 0d; for (int n : nums) { sum += n; Tänkbara scenarior double avg = sum / nums.length; return avg;

Vanligt anrop FileNotFoundException public int[] loadagearray(file in) throws FileNotFoundException { Scanner scan = new Scanner(in); public static void main(string[] args) throws FileNotFoundException { File infile = new File(args[0]); int [] ages = loadagearray(infile); // Läs in och lägg i en ny array... return ar; double m = average(ages); System.out.println( Avg age: + m); public double average(int [] nums){ double sum = 0d; for (int n : nums) { sum += n; Tänkbara scenarior double avg = sum / nums.length; return avg;

Vanligt anrop ArithmeticException public int[] loadagearray(file in) throws FileNotFoundException { Scanner scan = new Scanner(in); public static void main(string[] args) throws FileNotFoundException { File infile = new File(args[0]); int [] ages = loadagearray(infile); // Läs in och lägg i en ny array... return ar; double m = average(ages); System.out.println( Avg age: + m); public double average(int [] nums){ double sum = 0d; for (int n : nums) { sum += n; Tänkbara scenarior double avg = sum / nums.length; return avg;

Vanligt anrop public static void main(string[] args) { File infile = null; if (0 < args.length) { infile = new File(args[0]); else { System.out.println( Filename expected ); return; int [] ages; try { ages = loadagearray(infile); catch (FileNotFoundException fex) { System.out.println( File not found ); return; if (0 < ages.length) { double m = average(ages); System.out.println( Avg age: + m); else { System.out.println( No ages read from file ); public int[] loadagearray(file in) throws FileNotFoundException { public double average(int [] nums){ Scanner scan = new Scanner(in); // Läs in och lägg i en ny array... return ar; double sum = 0d; for (int n : nums) { sum += n; double avg = sum / nums.length; return avg;

Egna exceptions public void setdegrees(float degrees) throws IllegalArgumentException { if ((degrees < 0) (360 <= degrees)) { throw new IllegalArgumentException( Degree out of range );... Man kan använda en exceptionklass som redan finns eller skapa en egen.

Egna exceptions public class EngineException extends Exception { public class ElectricalException extends EngineException { public class CircuitException extends ElectricalException { public class PowerException extends ElectricalException { public class SensorException extends EngineException { public class SensorOffRangeException extends SensorException { public class SensorOffRangeHighException extends SensorOffRangeException { public class SensorOffRangeLowException extends SensorOffRangeException { public class SensorUnreadableException extends SensorException {

Checked - unchecked Dessa är unchecked Behöver inte deklareras eller fångas java.lang.exception java.lang.runtimeexception java.lang.object java.lang.throwable java.io.ioexception java.lang.error Errors är allvarliga fel och ska normalt inte fångas java.io.ioerror java.lang.arithmeticexception java.io.filenotfoundexception java.lang.virtualmachineerror java.lang.nullpointerexception UnsupportedEncodingException java.lang.internalerror java.lang.illegalargumentexception java.io.unknownhostexception java.lang.outofmemoryerror

in- och utmatning (I/O) indata Javaprogrammet utdata

in- och utmatning (I/O) indata Javaprogrammet utdata En ström (stream) av bytes

in- och utmatning (I/O) System.out skärmen tangentbordet System.in Javaprogrammet > System.err Dessa streams finns med från början

in- och utmatning (I/O) infil indata Javaprogrammet utdata utfil Läsning och skrivning med filer görs med hjälp av andra streams Programmeraren måste själv beställa dessa

Exempel på I/O till fil import java.util.random; import java.io.*; public class TestData { public static void main(string [] args) throws IOException { Random rnd = new Random(); String outfilename = test.dat ; // En FileWriter konverterar text till det lokala systemet FileWriter fw = new FileWriter(outFileName); // En BufferedWriter gör skrivningen till filsystemet effektivare BufferedWriter bw = new BufferedWriter(fw); // En PrintWriter har bra metoder för att skriva ut med PrintWriter pw = new PrintWriter(bw); // Skriv ut 500 rader med 30 slumptal i varje rad for (int line = 0; line < 500; line++) { for (int item = 0; item < 30; item++) { pw.print(rnd.nextint(100) + ); pw.println(); pw.close(); // Se till att buffrat data skrivs till disk.

Text, buffring och metoder PrintWriter print(...) println(...) BufferedWriter write(..) FileWriter close() close() buffer append(..) write(..) close() teckenkonvertering Externa minnen som hårddiskar m.m. hanterar inte enstaka tecken, de arbetar bara med hela block (ex 32 Kb). Buffring före skrivning leder till färre skrivningar i filen.

inga undantag SLUT FÖR DENNA GÅNG