INF 1010, vår 2005 uke 11 Anders Brunland 11. april 2005 Oppgave 1 Oppgave 1 i kapittel 19, Rett på Java Er følgende metoder lovlige? Hovorfor/hvorfor ikke? a) void koknverter ( int mnd ) { konverterdato ( mnd ); catch ( Exception e) { System. out. println (" Noe gikk veldig galt... "); catch ( KonverterDatoException kdm ) { System. out. println (" Feil månedsnummer "); Denne metoden er ikke lovlig. Siden man først fanger det mest generelle unntaket (Exception) vil man aldri kunne fange det mer spesielle unntaket (KonverterDatoException) det blir fanget i første catch-del. Feilmeldingen fra kompilatoren er: javac Unntaktest.java Unntaktest.java:8: exception KonverterDatoException has already been caught catch (KonverterDatoException kdm) { ^ 1 error Compilation exited abnormally with code 1 at Fri Apr 08 19:15:56 b) void konvertermer ( int mnd ) throws KonverterDatoException { konverterdato ( mnd ); finally { System. out. println (" takk for nå" ); 1
Denne metoden er lovlig. Først prøves den delen av koden som kan resultere i et unntak. Uavhengig av om det kastes et unntak eller ikke, utføres så setningen i finally-delen. Evt. unntak som blir kastet fanges muligens opp på kall-stedet, eller kastes videre derfra. Oppgave 2 Oppgave 2, kapittel 19, Rett på Java Hva blir utskriften til skjermen i følgende metode hvis filen ikke finnes? Hva om den finnes? 1 void lesfil () { 2 3 In inn = new In(" En fil som ikke finnes "); 4 System. out. println (" Utskrift 1" ); 5 catch ( IOException e) { 6 System. out. println (" Utskrift 2" ); 7 finally { 8 System. out. println (" Utskrift 3" ); 9 10 Hvis filen ikke finnes kastes det et unntak på linje 3. Unntaket er av typen FileNotFoundException, som er en subklasse av klassen IOException. IOException fanges opp på linje 5, og innholdet i catch-blokken blir utført. Tilslutt utføres finally-blokken. Resultatet blir som følger: Utskrift 2 Utskrift 3 Hvis filen finnes, forstetter programmet etter linje 3. Når try-delen er ferdig utføres finally-delen. Resultatet blir: Utskrift 1 Utskrift 3 Oppgave 3 Oppgave 3, kapittel 19, Rett på Java: Utvid konverterdato-metoden slik at den i tillegg til måned tar dag og år som parametere (dag oppgis som dato et tall mellom 1 og 31). Lag et testprogram. Eksempel på bruk av metoden: 2
konverterdato(2002, 12, 31) returnerer teksten 31. desember, 2002 konverterdato(2002, 4, 5) returnerer teksten 5. april, 2002 konverterdato(2002, 2, 29) gir en feil (et unntak) siden 2002 ikke er et skuddår. konverterdato(2002, 4, 31) gir en feil siden april ikke har 31 dager. Hint: Skuddår beregnes som følger. Hvis året er delelig med 4 og det ikke er et helt århundre, eller det er et helt århundre som er delelig med 400, der det et skuddår. Det gir at år 2000 var et skuddår, mens år 2100 ikke er et skuddår (ikke delelig med 400). /* * oppgave 3, kapittel 19. * Lagres på en fil ved navn Datokonverterer. java */ import easyio.*; import java.io.*; class Datokonverterer { public static void main ( String [] args ) { new Datokonverterer (); // For ikke å gjøre programmet unødig stort, er datoene som // konverteres skrevet rett inn i koden. Det overlates til leseren // å endre programmet slik at brukeren selv skriver inn datoene // som skal konverteres. Datokonverterer () { System. out. println ( konverterdato (2003, 4, 5)); System. out. println ( konverterdato (2000, 2, 29)); System. out. println ( konverterdato (2003, 4, 31)); catch ( KonverterDatoException e) { System. out. println (e. getmessage ()); System. out. println (" Takk for nå."); System. exit (0); String konverterdato ( int år, int mnd, int dag ) throws KonverterDatoException { 3
String [] mndnavn = {"", " januar ", " februar ", " mars ", " april ", " mai ", " juni ", " juli ", " august ", " september ", " oktober ", " november ", " desember "; // Sjekker lovlig måned if ( mnd < 1 mnd > 12) throw new KonverterDatoException(" Ulovlig måned : mnd = " + mnd ); // Sjekker lovlig dato if ( dag < 1 dag > 31) throw new KonverterDatoException(" Ulovlig dag : dag = " + dag ); // April, juni, september, og november kan bare ha 30 dager if ( dag > 30) { switch ( mnd ) { case 4: // april case 6: // juni case 9: // september case 11: // november throw new KonverterDatoException( mndnavn [ mnd ] + " kan ikke ha " + dag + " dager" ); // Februar kan maksimalt ha 29 dager if ( mnd == 2 && dag > 29) throw new KonverterDatoException( mndnavn [ mnd ] + " kan ikke ha " + dag + " dager "); // Hvis februar har mer en 28 dager må det være et skuddår. if ( mnd == 2 && dag > 28) { // Skuddår? boolean skuddår = ( år % 4 == 0 && år % 100!= 0) (år % 400 == 0); if (! skuddår ) throw new KonverterDatoException(" År " + år + " er ikke et skuddår." ); return dag + ". " + mndnavn [ mnd ] + ", " + år ; // end konverterdato class KonverterDatoException extends Exception { KonverterDatoException() { super (); 4
KonverterDatoException( String msg ) { super ( msg ); Resultat ved kjøring: >java -Dfile.encoding=cp850 Datokonverterer 5. april, 2003 29. februar, 2000 april kan ikke ha 31 dager Takk for nå. 5