Forelæsning Uge 14 Mandag

Relaterede dokumenter
Forelæsning Uge 14 Mandag

Sprogkonstruktion til beskrivelse af betingelser, som man forventer vil være opfyldt på bestemte steder i programmet

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Forelæsning Uge 4 Torsdag

COMPUTERSPIL 1. Opgave 1. Opgave 2

Forelæsning Uge 3 Mandag

Forelæsning Uge 4 Torsdag

Forelæsning Uge 2 Torsdag

Ugeseddel 4 1. marts - 8. marts

Forelæsning Uge 5 Mandag

Forelæsning Uge 4 Mandag

Forelæsning Uge 2 Mandag

Serialization i Java

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag

Forelæsning Uge 2 Torsdag

DM507 Algoritmer og datastrukturer

Forelæsning Uge 3 Mandag

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Forelæsning Uge 3 Mandag

Forelæsning Uge 10 Torsdag

Forelæsning Uge 4 Mandag

JSP, Tomcat. Tutorial lavet af Jákup W. Hansen TSU semester 10.october 2007

Forelæsning Uge 5 Mandag

Forelæsning Uge 5 Mandag

Servlets, Tomcat & BlueJ

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

DANMARKS TEKNISKE UNIVERSITET

Forelæsning Uge 2 Mandag

dmasark Aflevering - Uge 50

Forelæsning Uge 4 Torsdag

Forelæsning Uge 3 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 2 Mandag

DM507 Algoritmer og datastrukturer

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

DM507 Algoritmer og datastrukturer

COMPUTERSPIL 1. Opgave 1

Forelæsning Uge 4 Mandag

Forelæsning Uge 2 Mandag

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Forelæsning Uge 6 Mandag

Opfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner

Forelæsning Uge 12 Torsdag

Aarhus Universitet, Science and Technology, Computer Science. Exam. Wednesday 27 June 2018, 9:00-11:00

Forelæsning Uge 12 Mandag

Databaseadgang fra Java

Skriftlig eksamen i Datalogi

SWC eksamens-spørgsmål. Oversigt

Klasser og objekter. (Afsnit i manualen)

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Forelæsning Uge 2 Mandag

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Software Construction 1 semester (SWC) Spørgsmål 1

Skriftlig eksamen i Datalogi

Bemærk, der er tale om ældre versioner af softwaren, men fremgangsmåden er uændret.

Videregående programmering i Java

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

DRONNINGER (QUEENS) Opgave 1

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Introduktion til ActionScript, fortsat

Skriftlig eksamen i Datalogi

Dag 10 Flertrådet programmering

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Exceptions i Delphi. Try except

Skriftlig eksamen i Datalogi

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Kursusgang 11. Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design Oversigt over Java Swing

DM507 Algoritmer og datastrukturer

Forelæsning Uge 1 Torsdag

Forelæsning Uge 10 Mandag

Forelæsning Uge 1 Torsdag

Forelæsning Uge 10. Opremsningstyper. Forskellige teknikker til test og debugging. Afleveringsopgave: Debugging + Test.

Programmering for begyndere Lektion 2. Opsamling mm

Forelæsning Uge 3 Torsdag

Introduktion til ActionScript

Programmering I Java/C#

BRP Kursusintroduktion og Java-oversigt

BILLEDREDIGERING (IMAGES)

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Programmeringscamp. Implementer funktionerne én for én og test hele tiden.

Hent filoplysninger fra billeder og filer

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

Forelæsning Uge 3 Torsdag

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 13/ Side 1 af 7

Undtagelseshåndtering i C#

Forelæsning Uge 6 Mandag

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Abstrakte datatyper C#-version

Hvad er Objekter - Programmering

DM507 Algoritmer og datastrukturer

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

Lær Python dag 1 - modul 1

DM507 Algoritmer og datastrukturer

Transkript:

Forelæsning Uge 14 Mandag Defensiv programmering Metoder og konstruktører bør tjekke de parameterværdier, som de kaldes med Derved kan man ofte undgå ulovlige handlinger, såsom at dividere med nul eller tilgå et element, som ikke eksisterer (i en arrayliste eller et array) Exceptions Sprogkonstruktion til rapportering af fejl En kaldt metode kan kaste en exception, som så efterfølgende gribes (behandles) på det sted hvor metoden blev kaldt Assertions Sprogkonstruktion til beskrivelse af betingelser, som man forventer vil være opfyldt på bestemte steder i programmet Brugt i jeres regression tests (via metoderne assertequals, asserttrue og assertfalse) Fil-baseret input/output Hvordan læser og skriver man en fil? Område, hvor der let kan ske fejl (forkert filnavn, disk full, no permission, netværksfejl, osv.) Sådanne fejl håndteres elegant ved hjælp af exceptions Afleveringsopgave: Computerspil 5 Input/output og exception handling

Defensiv programmering En server er karakteriseret ved, at den er reaktiv og kun handler, når en klient anmoder om det Serveren gør intet på egen hånd To mulige strategier for programmering af servere Vi kan antage, at klienterne ved, hvad de gør, og kun foretager fornuftige og veldefinerede serverkald Vi kan antage, at klienterne indeholder fejl eller med vilje forsøger at udføre illegale serverkald Ovenstående introducerer fire spørgsmål Skal serveren tjekke om de parametre den modtager fra klienterne har rimelige værdier? Hvordan og til hvem rapporterer serveren eventuelle fejl? Hvordan kan en klient forudse/foregribe at dets serverkald fejler? Hvad bør en klient gøre, når et af dens serverkald fejler? 2

AddressBook projektet Lad os betragte et program, der implementerer en adressebog Systemet har tre klasser AddressBookGUI implementerer programmets grafiske brugergrænseflade AddressBook implementerer programmets øvrige funktionalitet. Klassen indeholder metoder til at tilføje, ændre, fjerne og søge i kontaktinformation ContactDetails indeholder kontaktinformationen, der består af navn, telefonnummer og adresse AddressBook gemmer kontaktinformation i en Map, hvor de kan findes ved at bruge enten navnet eller telefonnummeret som nøgle Et AddressBook objekt er et typisk eksempel på en server Objektet gør intet på egen hånd Det handler kun, når en klient (GUI-objektet) anmoder om det 3

removedetails metoden i AddressBook Parameterværdien bruges til at finde et sæt ContactDetails, hvis indgange derefter fjernes fra Map'en public void removedetails(string key) { ContactDetails details = book.get(key); book.remove(details.getname()); book.remove(details.getphone()); numberofentries--; Ovenstående giver os et problem Hvis den angivne nøgle ikke er i brug, vil metodekaldet book.get(key) returnere null Det betyder at metodekaldet details.getname() fejler med en NullPointerException Det er ikke nødvendigvis forkert Men det er en farlig fremgangsmåde specielt hvis man ikke selv har kontrol over, hvordan klienterne programmeres 4

Tjek af parametre Servere er særligt sårbare, når deres konstruktører og metoder modtager værdier via deres parametre Hvis man ved, at disse parameterværdier er fornuftige, er der ingen grund til at spilde tid på at teste dem I mange tilfælde har man dog ingen eller kun ringe indflydelse på, hvordan klienter programmeres, og så bør alle parameterværdier tjekkes Derved kan man ofte undgå ulovlige handlinger, såsom at dividere med 0, kalde en metode på en variabel, der har værdien null, eller tilgå et element som ikke eksisterer (i en arrayliste eller et array) Vi har nu "pakket" de fire sætninger ind i en if sætning Hvis nøglen er i brug gøres det samme som før Ellers gør man ingen ting public void removedetails(string key) { if( keyinuse(key) ) { ContactDetails details = book.get(key); book.remove(details.getname()); book.remove(details.getphone()); numberofentries--; 5

Rapportering af fejl Hvad bør serveren gøre, når den finder en illegal parameter? Serveren kan undlade at udføre det foretagne request Det gjorde vi for removedetails metoden Serveren kan også (sommetider) ændre parameterværdien til noget "fornuftigt" Serveren kan rapportere fejlen til brugeren Serveren kan printe en fejlmeddelelse eller bringe en dialogboks op på skærmen Begge dele har kun effekt, hvis der er en bruger til at se beskeden, og selv da vil de fleste brugere ikke forstå beskeden / vide hvad de skal gøre Hvad vil du gøre, hvis en hæveautomat fortæller dig, at der er en Fejl 5614 eller rejser en NullPointerException? Serveren kan rapportere fejlen til klienten Hvis metoden har returtypen void kan denne ændres til boolean, således at legale requests returnerer true og illegale returnerer false Hvis metoden har en non-void returtype kan man returnere en speciel værdi, der ikke er i brug (f.eks. null, 0, eller en negativ værdi) Serveren kan kaste en exception, som efterfølgende gribes af klienten (dvs. den programkode, der kaldte den fejlende metode) 6

Forskellige strategier til at rapportere fejl Brug af exception Det tjekkes om parameterværdien er null Hvis det er tilfældet skabes et exception objekt, og dette kastes ved hjælp af det reserverede ord throw Exception objektets type beskriver fejlen Herudover kan der være en tekststreng med yderligere information om fejlen Brug af returtype If sætningen er ændret til en if-else sætning Returværdien angiver om operationen lykkedes eller ej Returtypen er ændret fra void til boolean public boolean removedetails(string key) { if(key == null){ throw new IllegalArgumentException( "Null key in removedetails"); if( keyinuse(key) ) { ContactDetails details = book.get(key); book.remove(details.getname()); book.remove(details.getphone()); numberofentries--; return true; else { return false; Klienter kan undlade at tjekke returværdien Men de kan ikke ignorere exceptions Derfor er exceptions i mange tilfælde bedst 7

Exceptions Exceptions tillader klienter at forsøge at overleve/reparere fejl, som rapporteres fra servere Exceptions kastes af serveren (throw) og gribes af klienten (catch) Nedenstående klassediagram viser det hierarki som exceptions indgår i De fleste exceptions er checked, hvilket betyder at oversætteren protesterer, hvis de ikke håndteres af den kaldende klient RuntimeExceptions og dets subklasser er Throwable unchecked, hvilket betyder at oversætteren ikke tvinger programmøren til at håndtere Error dem NullPointerExceptions og IndexOutOfBounds- Exceptions er eksempler på RuntimeExceptions MyCheckedException Exception RuntimeException sta us Errors er alvorlige fejl, som et program ikke med fornuft kan forsøge at overleve MyUncheckedException 8

Unchecked versus checked exceptions Unchecked exceptions bruges i situationer, hvor fejlen bør føre til at programmet stopper Typisk fordi programmøren har lavet en logisk fejl, såsom at dividere med nul, kalde en metode på en variabel, der har værdien null, eller tilgå et element som ikke eksisterer (i en arrayliste eller et array) Sådanne fejl kan undgås hvis programmøren er kompetent og omhyggelig Checked exceptions bruges i situationer, hvor det giver mening, at klienten forsøge at reparere fejlen Throwable Hvis brugeren har angivet et filnavn som ikke eksisterer, kan man lade brugeren vælge/indtaste et nyt Error Exception Hvis systemet ikke kan skrive en fil, fordi disken er fuld, eller brugeren har manglende permissions, kan man lade MyCheckedException brugeren angive et nyt sted at placere filen RuntimeException sta us MyUncheckedException 9

Når en exception kastes Metoden (der kaster en exception) stopper øjeblikkeligt public boolean removedetails(string key) { if(key == null){ throw new IllegalArgumentException( "Null key in removedetails"); if( keyinuse(key) ) {... return true; else { return false; Eksemplet fra før Efter throw sætningen udføres der ikke flere sætninger (statements) Heller ikke for at returnere et resultat Oversætteren protesterer ikke over, at metoden har en sti (via throw sætningen) som ikke returnerer en værdi Den vil derimod protestere, hvis der umiddelbart efter throw sætningen indsættes en return sætning, idet denne aldrig vil kunne blive udført 10

Check af parameterværdier Unchecked exceptions bruges ofte til at standse programmet, hvis der anvendes en ulovlig parameterværdi Der gøres intet forsøg på at gribe den kastede exception, hvilket betyder at programmet standser I stedet rettes den logiske fejl i programmet, således at der ikke fremover kastes denne slags exceptions Det tjekkes om parameteren er null Det tjekkes om parameteren er den tomme eller en blank streng Hvis alt er ok, bruges nøglen til at hente de ønskede kontaktinformationer public ContactDetails getdetails(string key) { if(key == null) { throw new IllegalArgumentException( "Null key in getdetails"); if(key.trim().length() == 0) { throw new IllegalArgumentException( "Empty key in getdetails"); return book.get(key); 11

Check af parameterværdier i konstruktør Konstruktører kan også modtage illegale parameterværdier Det tjekkes om en eller flere parameterværdier er null. I så fald sættes de til den tomme streng Feltvariablerne initialiseres Hvis både name og phone er den tomme streng, kastes en exception Her kan exceptions forhindre, at der skabes "sære" objekter public ContactDetails(String name, String phone, String address) { if(name == null) { name = ""; if(phone == null) { phone = ""; if(address == null) { address = ""; this.name = name.trim(); this.phone = phone.trim(); this.address = address.trim(); if(this.name.isempty() && this.phone.isempty() { throw new IllegalStateException( "Either name or phone must be non-blank"); Det giver ikke mening at oprette objektet, idet man ikke har nogen nøgle, hvormed det kan tilgås (i Map'en) 12

Checked exceptions En metode, der kan kaste en checked exception, skal angive dette i sin header ved hjælp af det reserverede ord throws Det er også tilladt at anvende throws for unchecked exceptions men dette anbefales ikke public void savetofile(string filename) throws IOException {... Når man kalder en metode, der kan kaste en checked exception, skal man være parat til at gribe denne Dette gøres ved at placere kaldet i et try-delen af en try-catch sætning try blokken indeholder de sætninger, der kan føre til, at der kastes en exception catch blokken indeholder de sætninger, der skal udføres for at reparere situationen, dvs. gribe den kastede exception try { filename =... // Request filename from user addressbook.savetofile(filename); successful = true; catch( IOException e ) { Metodekald Den exception som kan kastes, og som skal gribes System.out.println("Unable to save to " + filename); successful = false; Hvis der kastes en exception, overføres kontrollen fra try-delen til catch-delen catch-delen udføres kun, hvis der kastes en exception 13

Try sætning try-catch sætningen kan indeholde flere catch blokke I så fald søges catch blokkene igennem forfra (som i en switch sætning) Den første catch blok, hvor exception typen matcher, udføres Rækkefølgen af catch blokkene er vigtig Hvis catch blokken med IOException flyttes op foran de to andre, vil disse aldrig kunne udføres, og vi vil få en compile-time fejl try-catch sætningen kan også indeholde en finally blok Denne er placeret efter catch blokkene Indeholder sætninger som altid skal udføres uanset om, der kastes en exception eller ej (under udførelsen af try blokken) try {... object-reference.method(...);... catch (EOFException e) { // Handle end of file exception... catch (FileNotFoundException e) { // Handle file not found exception...... catch (IOException e) { // Handle other IOExceptions...... finally { // Any actions common to whether or // not an exception is raised... 14

Eksempel på unyttig try sætning Checked exceptions er kun nyttige, hvis programmøren (på kaldsstedet) forsøger at reparere situationen Nedenstående try sætning er ikke nyttig Metodekaldet book.search kan rejse en exception Når dette sker udskriver den kaldende metode en fejlmeddelelse ContactDetails details = null; try { details = book.search(...); catch(exception e ) { System.out.println("Error " + e); String phone = details.getphone(); Herefter fortsætter man ufortrødent Men details er stadig null Kaldet af getphone giver derfor ikke mening, og vil rejse en NullPointerException 15

Eksempel på nyttig try sætning Erklæring af to lokale variabler til kontrol af den efterfølgende løkke do-while løkke Forsøg at gemme på en fil Hvis det mislykkes rejses en exception I catch-delen beder man så brugeren specificere et alternativt filnavn Kroppen udføres indtil, det lykkes at gemme eller man har forsøgt mange gange filename =... // Request filename from user // Try to save the address book boolean successful = false; int attempts = 0; do { try contacts.savetofile(filename); successful = true; catch(ioexception e) { System.out.println("Unable to save to " + filename); attempts++; filename =... // Request alternative filename while(!successful && attempts < MAX_ATTEMPTS); if(!successful) { report the problem and give up; Rapporter at man opgiver 16

Videresendelse af exceptions (propagering) I stedet for at gribe en exception, kan den videresendes til omgivelserne (propagering) Den kaldende metode indeholder så ikke længere en try sætning til at gribe den kastede exception I stedet har den en throws clause i sin header (signatur) Dette indikerer, at den kastede exception videresendes til omgivelserne, dvs. til den metode, der har kaldt metoden med throws sætningen Videresendelse bruges når en metode er ude af stand til selv at reparere situationen normalt kun for checked exceptions Når en metode kan kaste en checked exception, tjekker oversætteren, at alle kaldende metoder, enten indeholder en try-catch sætning, der beskytter kaldet og specificerer, hvordan det gribes, eller throws clause, der videresender den kastede exception til omgivelserne 17

Erklæring af nye exception klasser Man kan definere sine egne exception klasser Dette gøres ved at lave en subklasse af en eksisterende exception klasse Hvis klassen er en subklasse af RuntimeException, vil dens exceptions være unchecked, ellers vil de være checked Der er intet nyt i erklæringen af exception klasser Checked exception Feltvariabel Konstruktør Accessor metode tostring metode public class NoMatchingDetailsException extends Exception { private String key; public NoMatchingDetailsException(String key) { this.key = key; public String getkey() { return key; public String tostring() { return "No details matching: " + key + " were found"; Når en exception er kastet, kan den "dårlige" key, tilgås via getkey metoden Den kan også ses i den diagnostiske tekst (som bruger tostring metoden) 18

Kursusevaluering Kursusevalueringer er et vigtigt redskab til at forbedre vores kurser Jeres kommentarer bruges af forelæserne til at forbedre næste års kurser Alle evalueringerne gennemgås af institutledelsen samt formændene for uddannelsesudvalget Dette er medvirkende til at kurserne opretholder deres høje kvalitet For at forbedre svarprocenten har fakultetet besluttet, at der skal afsættes tid ved forelæsningerne til at besvare kursusevalueringen Derfor vil vi nu bruge 5-10 minutter på det Resultatet af kursusevalueringen vil blive gennemgået og diskuteret ved den afsluttende forelæsning i næste uge Jeg opfordrer kraftigt til, at I bruger tid på at deltage i denne (og andre) kursusevalueringer Det er en nem måde at få indflydelse på Det forbedrer forholdene for jer selv og for fremtidige studerende Det hjælper mig (og andre undervisere) med at forbedre indholdet af undervisningen 19

Påtænkt ændring til næste år Køreprøverne får to ekstra spørgsmål Implementation af to metoder ved hjælp af de funktionelle algoritmeskabeloner Opgaven om Funktionel programmering flyttes til anden øvelsesgang i uge 6 (dvs. inden køreprøven) Ovenstående betyder Bedre sammenhæng mellem forelæsningen om funktionel programmering og øvelserne, hvor funktionel programmering bruges i praksis Der bliver lidt mere at lave i uge 6-7, som mange har oplevet som værende "lidt tynde" Man får mulighed for at score nogle flere point i de sidste 10-15 minutter af køreprøven (i stedet for blot at sidde og vente) Man kan ikke længere dumpe køreprøven Intet krav om at man skal nå mindst 2 tjekpunkter Hvis man kun klarer et tjekpunkt, vil man have få point med til eksamen Herudover vil det nok også være vanskeligt at klare computerspilsopgaven Køreprøven vil være et pejlemærke for den enkelte ikke en stopprøve 20

Assertions Vi har ofte en forventning om at visse betingelser er opfyldt på bestemte steder i vores program Efter udførelsen af removedetails metoden vil vi forvente, at nøglen, der blev anvendt som parameterværdi, ikke længere forekommer i adressebogen størrelsen af adressebogen er konsistent, dvs. at værdien af feltvariablen numberofentries er lig med, antallet af kontaktinformationer Dette tjekkes ved hjælp af to assertions indeholdende det reserverede ord assert public void removedetails(string key) { if(key == null){ throw new IllegalArgumentException( "Null key in removedetails"); if( keyinuse(key) ) { ContactDetails details = book.get(key); book.remove(details.getname()); book.remove(details.getphone()); numberofentries--; assert!keyinuse(key); assert consistentsize() : "Inconsistent book size in removedetails"; et boolske udtryk som skal testes en (optional) tekststreng som beskriver, hvad der gik galt 21

Metoderne keyinuse and consistentsize Den første metode er simpel Brug containskey metoden fra Map interfacet private boolean keyinuse(string key) { return book.containskey(key); Den anden metode er lidt mere kompleks Lokal variabel indeholdende værdierne fra AddressBook Værdierne kopieres over i en mænge (Set), hvorved dubletter elimineres private boolean consistentsize() { Collection<ContactDetails> allentries = book.values(); Set<ContactDetails> uniqueentries = new HashSet<>(allEntries); return numberofentries == uniqueentries.size(); Tjek at størrelsen at numberofentries er identisk med antal elementer i mængden 22

Brug af assertions En assertion sætning opfylder to formål Den beskriver en betingelse, som vi forventer er opfyldt på det sted, hvor assertion sætningen er indsat en sådan betingelse kaldes en invariant og gør vores kode mere læselig og lettere at forstå) Under programudførelsen kan det tjekkes, at betingelsen virkelig er opfyldt, og hvis dette ikke er tilfældet kastes en AssertionError (subklasse af Error) Assertions kan let slås til og fra de vil typisk være slået til mens programmet udvikles og testes fra når programmet anvendes af brugere (produktionsmode) I BlueJ er assertions integreret med JUnit tests Metoderne assertequals, asserttrue og assertfalse, som I har brugt i forbindelse med jeres testmetoder, er implementeret ved hjælp af en assert sætning Ved anvendelse af JUnit tests vises assertion errors fra de testede klasser i test vinduet (sammen med assertions errors fra JUnit testene) 23

Fil-baseret input/output Hvordan læser og skriver man en fil? Område, hvor der let kan ske fejl (forkert filnavn, disk fuld, manglende permission, netværksfejl, osv.) Sådanne fejl håndteres ved hjælp af exceptions Java's oprindelige support for i/o findes i pakken java.io Denne indeholder en lang række subklasser, som supporter input/output operationer Herudover definerer den IOException, som er en checked exception Vigtige subklasser er FileNotFoundException and EOFException (EOF end of file) Senere versioner af Java API'en har introduceret pakken java.nio Java.nio har en række tilhørende pakker såsom java.nio.file og java.nio.charset Klasserne i nio hierarkiet erstatter delvis klasserne i java.io pakken (på samme måde som Swing delvist erstatter AWT) 24

Files og streams Input/output opdeles i Tekstfiler Indeholder tegn-baseret information i en form, som kan læses og forstås af mennesker f.eks. html filer, programfiler og dokumentationsfiler Svarer til char og String typerne Håndteres ved hjælp af readers og writers såsom FileReader, BufferedReader og FileWriter Streams Indeholder binær information såsom billeder eller eksekverbare programmer Svarer til byte typen Streams håndteres ved hjælp af stream handlers Bemærk at disse streams intet har med de streams at gøre, som vi mødte i afsnittet om funktionel programmering 25

File klassen og Path interfacet En fil er ikke blot et navn og noget indhold Filer ligger i foldere (directories) De indeholder information om størrelse, hvem der ejer dem, og hvem der kan tilgå/modificere dem De kan være skjulte (hidden) osv. Klassen File i java.io indeholder en lang række metoder til at understøtte ovenstående Et File objekt i et program indeholder information om en fils egenskaber (men indeholder ikke filen selv) Ved hjælp af et File objekt kan man f.eks. undersøge om en fil eksisterer, og på den måde undgå at fremprovokere en FileNotFoundException Tilsvarende indeholder java.nio.file pakken interfacet Path og Files klassen (som er mere moderne) 26

File output består af tre skridt Åben filen Løkke, hvor man skriver data Luk filen Håndtering af fejl try { FileWriter writer = new FileWriter(file name); while(there is more text to write) {... writer.write(next piece of text);... writer.close(); catch(ioexception e) { something went wrong with accessing the file; Alle tre skridt kan fejle af forskellige grunde Mange af disse er fuldstændig udenfor programmørens kontrol (såsom en disk, der er fuld eller ødelagt) Disse fejl håndteres ved hjælp af IOExceptions Læs detaljer i BlueJ bogen (de egner sig ikke til en forelæsning) 27

File input består af de samme tre skridt Nu beskrevet i lidt større detaljer og med brug af faciliteter fra nio Åben filen Karaktersæt Filens sti (navn + placering i folder hierarkiet) Læs data Håndter fejl Charset charset = Charset.forName("US-ASCII"); Path path = Paths.get(file name); try( BufferedReader reader = Files.newBufferedReader(path, charset)) { String line = reader.readline(); while( line!= null ) { do something with line line = reader.readline(); catch(filenotfoundexception e) { deal with the exception catch(ioexception e) { deal with the exception Filen åbnes ved hjælp af en klassemetode i Files klassen Ved at placere åbningen i en parentes efter nøgleordet try, sikrer man, at filen automatisk lukkes efter læsningen (så det behøves vi ikke selv at gøre) Læs detaljer i BlueJ bogen (de egner sig ikke til en forelæsning) 28

Files klassen (java.nio) og Scanner klassen (java.util) Files klassen indeholder klassemetoden lines Tager en parameter af typen Path Returnerer en Stream<String> (som kendt fra afsnittet om funktionel programmering) Denne kan behandles som en (funktionel) stream eller konverteres til et array eller en arrayliste På denne måde kan man helt undgå at bruge klassen BufferedReader Stream<String> mystream = Files.lines(path); Scanner klassen indeholder metoder til at opbryde en tekst i delkomponenter nextline, nextint, nextdouble, nextboolean, osv. hasnextline, hasnextint, hasnextdouble, hasnextboolean, osv. 29

System klassen System klassen indeholder tre klassevariabler in af typen InputStream standard input stream out af type PrintStream standard output stream err af type PrintStream standard error output stream I BlueJ er alle tre knyttet til terminalvinduet Input via System.in Output via System.out Errors via System.err I kan skrive i denne del af terminalvinduet via System.err.println(" ") Welcome to the DodgySoft Technical Support System. Please tell us about your problem. We will assist you with any problem you might have. Please type 'bye' to exit our system. > My web browser crashes each morning Well, it never crashes on our system. It must have something to do with your system. Tell me more about your configuration. > Windows 7 This is a known bug to do with the Windows operating system. Please report it to Microsoft. There is nothing we can do about this. > Errors written to System.err is shown here 30

Computerspil 5 I den femte og sidste delaflevering skal I bruge nogle af de ting, som I har lært om exceptions og fil-baseret input/output Programmet kan allerede gemme de træk, der laves, og afspille disse igen (ved brug af et Log objekt og et LogPlayer objekt) Det er nu jeres opgave at implementere metoder/konstruktører til at: konvertere et Log objekt til dets String repræsentation genskabe et Log objekt ud fra dets String repræsentation gemme et logget spil på en tekstfil i operativsystemet indlæse en tekstfil fra operativsystemet og starte afspilning af det spil, der er gemt på filen Herudover skal I (som sædvanlig) rette gamle fejl og mangler holde jeres dokumentation opdateret, herunder tilføje dokumentation for nye programdele I behøver ikke at lave regressiontests for de nye metoder De testes via to testmetoder, som vi har udviklet til jer 31

Opsummering Defensiv programmering Servere bør (i de fleste tilfælde) tjekke de parameterværdier, som de modtager fra deres klienter i kald af metoder/konstruktører Derved kan man ofte undgå ulovlige handlinger, såsom at dividere med nul eller tilgå et element, som ikke eksisterer (i en arrayliste eller et array) Exceptions Sprogkonstruktion til rapportering af fejl En kaldt metode kan kaste en exception, som så efterfølgende gribes på det sted hvor metoden blev kaldt Assertions Sprogkonstruktion til beskrivelse af betingelser, som man forventer vil være opfyldt på bestemte steder i programmet (invarianter) Betingelserne kan testes under programudførelsen Fil-baseret input/output Hvordan læser og skriver man en fil? Område, hvor der let kan ske fejl (forkert filnavn, disk full, no permission, osv.) Sådanne fejl håndteres elegant ved hjælp af exceptions Afleveringsopgave: Computerspil 5 Input/output og exception handling 32

Det var alt for nu.. spørgsmål 33