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

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

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

Testning och felhantering

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

Klassen javax.swing.timer

Objektorienterad programmering

Testning av program. Verklig modell för programutveckling

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

Föreläsning 14. Filhantering

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

OOP Objekt-orienterad programmering

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

Objektorienterad Programmering (TDDC77)

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

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

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

Språkkonventioner och redigering av tal.

Input. Programmering. Andra källor

Parallellism, återblick

F10 - Exceptions. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Chapter 4: Writing Classes/ Att skriva egna klasser.

JAVAUTVECKLING LEKTION 7

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

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.

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

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

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.

JAVAUTVECKLING LEKTION 4

Lösningsförslag, tentamen FYTA11 Javaprogrammering

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

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

Föreläsning 7. for-satsen Fält

Lösningar för tenta 2 DAT043,

Objektorienterad Programmering (TDDC77)

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

Föreläsning 3. Iteration while-satsen

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

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

DAT043 Objektorienterad Programmering

Att öva på och förstå ett program med flera samverkande klasser.

Föreläsning 3. Iteration. while-satsen for-satsen do-satsen

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

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

Lösningar för tenta 3 DAT043,

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Tentamen FYTA11 Javaprogrammering

Lösningsförslag till tentamen

Objektorienterad programmering i Java

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

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Tentamen OOP

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

Iteration. Föreläsning 3. TDA540 - Objektorienterad Programmering

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

Objektorienterad Programmering (TDDC77)

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

for-satsen Fält for-satsen Föreläsning 8 (OH-bilder 7) for-satsen for-sats är en styrsats för iterationer. for-sats har följande generella utseende:

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

Föreläsning 3-4 Innehåll

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Felhantering TDDD78, TDDE30, 729A

OOP Objekt-orienterad programmering

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

Föreläsning 9-10 Innehåll

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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

OOP Objekt-orienterad programmering

Objektorienterad programmering

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

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

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

Mer om klasser och objekt

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

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

Föreläsning 12. Klassen Timer Rörliga figurer Testning Undantag. intcomponent(pen); olor(color.blue); int w = 30;

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

Föreläsning 6: Metoder och fält (arrays)

F4. programmeringsteknik och Matlab

Programmeringsteknik och Matlab. Dagens program. Viktiga datum. Repetitionsexempel. Repetition av if/else, for, while och Scanner

Obligatorisk uppgift: Banksystem

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

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

Föreläsnings 10 - Överlagring, Konstruerare, Arv, Mer Exceptions, Reguljära Uttryck

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

TDDC77 Objektorienterad Programmering

Föreläsning 3. Föreläsning 3. Iteration. while-satsen for-satsen do-satsen. while-satsen. do-satsen. Datatypen double

Iteration while-satsen

Del A (obligatorisk för alla)

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

TENTAMEN OOP

Programmering för språkteknologer I, VT2012. Rum

Språket Python - Del 2 Grundkurs i programmering med Python

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

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

Föreläsning 3. Stack

OOP Objekt-orienterad programmering

Transkript:

Föreläsnings 9 - Exceptions, I/O Josef Svenningsson Tisdag 6/11

Undantag - Exceptions Kommer ni ihåg det här programmet? Det var ett av de första ni såg i första föreläsningen. import javax.swing.*; public class Add { public static void main(string[] args) { String input = JOptionPane.showInputDialog("Ange första talet:"); int number1 = Integer.parseInt(input); input = JOptionPane.showInputDialog("Ange andra talet:"); int number2 = Integer.parseInt(input); int sum = number1 + number2; JOptionPane.showMessageDialog(null, "Summan av talen är " + sum); Vad händer om man skriver något annat än ett tal i dialogrutorna?

Undantag - Exceptions Här är ett annat, liknande program som gör division istället. import javax.swing.*; public class Divide { public static void main(string[] args) { String input = JOptionPane.showInputDialog("Ange första talet:"); int number1 = Integer.parseInt(input); input = JOptionPane.showInputDialog("Ange andra talet:"); int number2 = Integer.parseInt(input); int quote = number1 / number2; JOptionPane.showMessageDialog(null, "Kvoten mellan talen är " + quote); Vad händer om man försöker dividera med noll?

Undantag - Exceptions Vissa operationer kan inte utföras på ett korrekt sätt om man ger fel indata, t.ex. om man ber datorn dividera med noll. Det finns inget vettigt värde att returnera i dessa lägen. Då skapas ett undantag (exception på engelska). Detta gör exekveringen avbryts. När programmet avbryts skrivs ut ett felmeddelande som talar om vilket typ av untantag som uppstod. Exception in thread "main" java.lang.arithmeticexception: / by zero at Divide.main(Divide.java:8)

Fånga Exceptions I allmänhet så vill man ju inte att program avbryts när det sker ett exception. Därför finns det ett sätt att fånga dem. Det görs med en try - catch sats. try { // Kod som vi vill köra och som kan // resultera i ett exception catch (E e) { // Denna del körs bara om ett exception kastas // i koden ovan. // Här kan vi åtgärda det som orsakade att det // blev ett exception.

Division - nu med felhantering Låt oss skriva om vårt divisionsprogram så att det kan hantera division med noll. Istället för att programmet avslutat med ett exception fångar vi detta exception med en try - catch sats och meddelar användaren att den inte får dividera med noll. Ett annat sätt, som kanske är bättre, är att testa nämnaren i en if-sats. Vi använder detta exempel mest för att illustrera try - catch.

Division - nu med felhantering import javax.swing.*; public class SafeDivide { public static void main(string[] args) { String input = JOptionPane.showInputDialog("Ange första talet:"); int number1 = Integer.parseInt(input); input = JOptionPane.showInputDialog("Ange andra talet:"); int number2 = Integer.parseInt(input); try { int quote = number1 / number2; JOptionPane.showMessageDialog(null, "Kvoten mellan talen är " + quote); catch (ArithmeticException e) { JOptionPane.showMessageDialog(null, "Division med noll är inte tillåten");

Fixa inläsning av tal Vårt program kastade också ett exception om man matade in någonting annat än ett tal. Detta kan vi fixa på två sätt: Använda klassen Scanner som ni har sett i tidigare föreläsningar. Fånga exceptions på samma sätt som vi löste problemet med division med noll. Jag rekommenderar att ni använder Scanner i detta fall. Exceptions bör man undvika om det går. Det betyder inte att exceptions är dåliga, men de ska bara användas när de faktiskt behövs.

Kasta Exceptions - Exempel Låt oss säga att vi vill skriva en klass för bankkonton. Vi vill bland annat ha en metod withdraw som tar ut pengar ur kontot. Men vad ska vi göra om pengarna inte räcker till? public class Account { private int balance; public void withdraw(int amount) { if (amount < balance) { balance -= amount; else { // Vad ska vi göra här?

Kasta Exceptions - Exempel Ett sätt är att kasta ett exception. Detta görs med en throw sats. Vi behöver också skriva new för att skapa ett nytt exception. public class Account { private int balance; public void withdraw(int amount) { if (amount < balance) { balance -= amount; else { throw new IllegalArgumentException();

Checked and Unchecked Exceptions I Java skiljer man på två typer av exceptions: Unchecked Exceptions Checked Exceptions De exception vi sett hittills har varit unchecked exceptions.

Unchecked Exceptions Unchecked exceptions kan förekomma i princip var som helst och beror ofta på programmeringsfel. Det finns för det mesta inte så mycket att göra förutom att krascha programmet. Exempel på Unchecked Exceptions. ArithmeticException När resultatet av en aritmetisk operation inte är väldefinierad, t.ex. division med noll. NullPointerException När man försöker använda en referensvariabel som inte har blivit tilldelad ett objekt. Exempel: Scanner sc; sc.nextint(); IllegalArgumentException Används när en metod får ett argument som inte kan behandlas.

Checked Exceptions Checked exceptions används för de typer av fel som ofta inte är programmeringsfel. De beror ofta på saker som är utanför programmerarens kontroll. Därför är det viktigt att fånga checked exceptions. Exempel: FileNotFoundException När man försöker läsa en fil som inte existerar. LineUnavailableException En ljudenhet man försöker använda är upptagen av ett annat program.

Checked Exceptions När man använder checked exceptions hjälper Java till att hålla reda på vilka som kan kastas. Om man anropar en metod som kan kaste ett checked exception så måste man antingen fånga det eller deklarera att man kastar det vidare. Om man vill kasta ett exception vidare i en metod deklarerar man detta genom att lägga till throws och namnet det exception man vill kasta vidare. Detta skrivs efter parametrarna till en metod. public static void main(string[] args) throws FileNotFoundException {...

Läsa filer I Javas standardbibliotek använder man klassen File för att använda filer. Den finns i paketet java.io. När man vill läsa filer är det enklast att använda Scanner precis som vi använt den för strängar. Scanner sc = new Scanner(new File("file.txt"));

Läsa filer När man öppnar en fil finns en risk att filen inte finns. Därför kan ett exception kastas: FileNotFoundException. Detta är ett checked exception, så vi måste antingen fånga det eller deklarera att vi kastar det vidare.

Räkna rader i en fil import java.util.*; import javax.swing.*; import java.io.*; public class CountLines { public static void main(string[] args) throws FileNotFoundException { String filename = JOptionPane.showInputDialog(null,"Ange filnamn"); File file = new File(fileName); int lines = countlines(file); JOptionPane.showMessageDialog(null,"Antal rader i filen " + file.getname() + " är " + lines + "."); public static int countlines(file file) throws FileNotFoundException { Scanner sc = new Scanner(file); int lines = 0; while (sc.hasnextline()) { sc.nextline(); lines++; return lines;

Ett bättre sätt att välja filer på Att använda showmessagedialog är inte så smidigt för att välja filer. Java tillhandahåller en klass JFileChooser presenterar en filväljardialog som gör det enkelt för användaren att välja filer. JFileChooser chooser = new JFileChooser(); int returnval = chooser.showopendialog(null); När man skapat en filväljardialog får man ett returvärde som indikerar om användaren klickade Open eller Cancel.

Ett bättre sätt att välja filer på import java.util.*; import javax.swing.*; import java.io.*; public class CountLines2 { public static void main(string[] args) throws FileNotFoundException { JFileChooser chooser = new JFileChooser(); int returnval = chooser.showopendialog(null); if (returnval == JFileChooser.APPROVE_OPTION) { File file = chooser.getselectedfile(); int lines = countlines(file); JOptionPane.showMessageDialog(null,"Antal rader i filen " + file.getname() + " är " + lines + "."); public static int countlines(file file) throws FileNotFoundException { Scanner sc = new Scanner(file); int lines = 0; while (sc.hasnextline()) { sc.nextline(); lines++; return lines;

Skriva filer Ett smidigt sätt att skriva till filer är att använda klassen PrintWriter. När man skapar ett object sådant objekt öppnas en fil som man enkelt kan skriva till. Man kan skriva en rad text till en fil med hjälp av metoden println. När man är färdig med att skriva till en fil är det viktigt att stänga filen. Annars kanske allt inte blir korrekt skrivet till den. Detta görs med metoden close.

Numrera rader import java.io.*; import javax.swing.*; import java.util.scanner; public class NumberLines { public static void main(string[] args) throws FileNotFoundException { JFileChooser chooser = new JFileChooser(); int returnval = chooser.showopendialog(null); if (returnval == JFileChooser.APPROVE_OPTION) { Scanner infile = new Scanner(chooser.getSelectedFile()); String filename = JOptionPane.showInputDialog(null,"Ange utfil"); PrintWriter outfile = new PrintWriter(fileName); int linenumber = 1; while(infile.hasnextline()) { String line = infile.nextline(); outfile.println(linenumber + " " + line); linenumber++; infile.close(); outfile.close();

Stäng alltid filer Det är viktigt att alltid stänga filer, oavsett vad som händer. Även om ett exception kastas så måste vi se till att stänga de filer vi öppnat. För detta använder vi try - finally. try { // Kod som vi vill köra och som kan // resultera i ett exception finally { // Denna del körs alltid efter att koden ovan har kört, // oavsett om den resulterade i ett exception eller // avslutades som vanligt.

Numrera rader Vi kan skriva om vårt program för att numrera rader med hjälp av try - finally så att våra filer alltid stängs. Använd alltid try - finally för att stänga filer!

Numrera rader import java.io.*; import javax.swing.*; import java.util.scanner; public class NumberLines2 { public static void main(string[] args) throws FileNotFoundException { JFileChooser chooser = new JFileChooser(); int returnval = chooser.showopendialog(null); if (returnval == JFileChooser.APPROVE_OPTION) { Scanner infile = new Scanner(chooser.getSelectedFile()); String filename = JOptionPane.showInputDialog(null,"Ange utfil"); PrintWriter outfile = new PrintWriter(fileName); try { int linenumber = 1; while(infile.hasnextline()) { String line = infile.nextline(); outfile.println(linenumber + " " + line); linenumber++; finally { infile.close(); outfile.close();

Argument till ett program Vad är det för mening med argumentet till metoden main som vi alltid måste ange? public static void main(string[] args)

Argument till ett program public static void main(string[] args) Argumentet args kan innehålla parametrar till programmet. Dessa kan anges om man startar ett program från kommandotolken. > java Args apa bepa cepa args[0] kommer att innehålla stränger "apa", args[1] kommer att innehålla "bepa" och args[2] kommer att innehålla "cepa". Detta är ett smidigt sätt att t.ex. ange filnamn till ett program.

Argument till ett program i jgrasp För att skicka argument till ett program, klicka i Build > Run Arguments. Då får ni upp en liten ruta ovanför koden som heter Run Arguments där ni kan skriva i vilka argument ni vill att programmet ska köras med.

Inspektera argumenten till ett program Följande lilla program skriver ut alla argument till ett program. public class Args { public static void main(string[] args) { for(string s : args) { System.out.println(s);