Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Filtrering:

05.05: Egne Exceptions

Du får utdelt følgende klasser:

class Bok {
    private String tittel;

    public Bok (String t) {
        tittel = t;
    }

    public String toString() {
        return tittel;
    }
}
class Bokhylle {
    private Bok[] boeker;

    public Bokhylle (int antPlasser) {
        boeker = new Bok[antPlasser];
    }

    //Forsoeker aa sette inn en bok paa foerste ledige plass i bokhyllen
    public void settInn(Bok b) {

        for (int i = 0; i < boeker.length; i++) {
            if (boeker[i] == null) {

                boeker[i] = b;
                return;
            }
        }
    }

    public void skrivBoeker() {
        for (Bok b: boeker) {
            if (b != null) {
                System.out.println(b);
            }
        }
    }
}
class TestBokhylle {

    public static void main(String[] args) {

        Bokhylle bokhylle = new Bokhylle(3);
        System.out.println("Setter inn boeker:");

        String[] titler = {"De doedes tjern", "Doppler", "Doppler", "Misery", "Gone with the Wind"};

        for (int i = 0; i < titler.length; i++) {
                bokhylle.settInn(new Bok(titler[i]));
        }

        System.out.println("\nSkriver ut boeker:");
        bokhylle.skrivBoeker();
    }
}

a) Kopier klassene og kjør koden. Hva skjer?

b) Skriv en klasse IkkeMerPlassException som arver fra Exception. IkkeMerPlassException skal ta imot en identifiserende tekststreng i sin konstruktør, i vårt tilfelle en boktittel. Superklassen til feilmeldingen vår, Exception, kan ta imot et parameter i konstruktøren i form av en melding. Du skal sende med en melding som forklarer at det ikke var plass og hvilken tittel det gjelder.

c) Skriv en klasse DuplikatExeption. Denne skal ha samme struktur som IkkeMerPlassException, men den skal istedet gjøre et kall til super med en melding om at elementet vi prøvde å legge inn er et duplikat.

d) Endre settInn-metoden i klassen Bokhylle slik at den kaster en DuplikatException dersom vi forsøker å sette inn en bok som allerede finnes i lista. Oppdater hovedprogrammet slik at det behandler denne Exceptionen.

e) Endre settInn igjen slik at den nå også kaster en IkkeMerPlassException dersom vi ikke fant noen ledig plass i bokhyllen til den nye boken. Oppdater main-metoden i hovedprogrammet slik at det behandler også denne feilen.

b)

class IkkeMerPlassException extends Exception {
    public IkkeMerPlassException (String id) {
        super("Det var ikke plass til aa sette inn " + id);
    }
}

c)

class DuplikatException extends Exception {
    public DuplikatException (String id) {
        super("Duplikat: " + id);
    }
}

d-e)

public void settInn(Bok b) throws DuplikatException, IkkeMerPlassException {

        for (int i = 0; i < boeker.length; i++) {

            //Boken ligger alt inne
            if (boeker[i] != null && boeker[i].toString().equals(b.toString())) {
                throw new DuplikatException(b.toString());
            }

            if (boeker[i] == null) {

                boeker[i] = b;
                return;
            }
        }

        //Vi har kommet gjennom lista uten aa finne noen ledig plass
        throw new IkkeMerPlassException(b.toString());
    }
public static void main(String[] args) {

        Bokhylle bokhylle = new Bokhylle(3);
        System.out.println("Setter inn boeker:");

        String[] titler = {"De doedes tjern", "Doppler", "Doppler", "Misery", "Gone with the Wind"};

        for (int i = 0; i < titler.length; i++) {

            try {
                bokhylle.settInn(new Bok(titler[i]));

            } catch (DuplikatException de) {
                System.out.println(de.getMessage());

            } catch (IkkeMerPlassException impe) {
                System.out.println(impe.getMessage());
            }
        }

        System.out.println("\nSkriver ut boeker:");
        bokhylle.skrivBoeker();
    }

05.06: Feilhåndtering

a) Kopier og forsøke å kjøre følgende kode. Hva skjer når koden kjøres? Forklar.

class FeilTest {
    public static void main(String[] args) {

        //Oppretter en array med noen strenger
        String[] tallstrenger = {"10", "1", "32", "hei", "14", "11"};

        //Forsoeker aa konvertere alle strengene til heltall og skrive ut
        for (int i = 0; i < tallstrenger.length; i++) {
            int tmp = Integer.parseInt(tallstrenger[i]);
            System.out.println("Tallet er: " + tmp);
        }
    }
}

b) Bruk feilhåndtering (try/catch) til å avslutte løkken og skrive ut en feilmelding til bruker dersom konverteringen fra String til int feiler (hint! utskriften fra oppgave a forteller deg hva slags feil du trenger å fange opp).

c) Endre feilhåndteringen din slik at programmet skriver ut en feilmelding når en konvertering feiler, men lar løkken fortsette etter at feilen er håndtert. Klarer du også å skrive ut verdien til tekststrengen det gjelder?

a) For hver gjennomgang av løkken forsøker vi å konvertere tekststrengen på den nåværende plassen i lista til et heltall og deretter skrive det ut. Men på indeks 3 i lista finner vi strengen "hei", som ikke er et heltall, og vi får da feilen "NumberFormatException".

>java FeilTest
Tallet er: 10
Tallet er: 1
Tallet er: 32
Exception in thread "main" java.lang.NumberFormatException: For input string: "hei"
        at java.lang.NumberFormatException.forInputString(NumberFormatExcepti n.java:65)
        at java.lang.Integer.parseInt(Integer.java:580)
        at java.lang.Integer.parseInt(Integer.java:615)
        at FeilTest.main(FeilTest.java:10)

b)

class FeilTest {
    public static void main(String[] args) {

        //Oppretter en array med noen strenger
        String[] tallstrenger = {"10", "1", "32", "hei", "14", "11"};

        //Forsoeker aa konvertere strengene til heltall og skrive ut
        try {
            for (int i = 0; i < tallstrenger.length; i++) {
                int tmp = Integer.parseInt(tallstrenger[i]);
                System.out.println("Tallet er: " + tmp);
            }
        } catch (NumberFormatException e) {
            System.out.println("Formateringsfeil!");
        }
    }
}

c)

class FeilTest {
    public static void main(String[] args) {

        //Oppretter en array med noen strenger
        String[] tallstrenger = {"10", "1", "32", "hei", "14", "11"};

        //Forsoeker aa konvertere strengene til heltall og skrive ut
        for (int i = 0; i < tallstrenger.length; i++) {
            try {
                int tmp = Integer.parseInt(tallstrenger[i]);
                System.out.println("Tallet er: " + tmp);
            }
            catch (NumberFormatException e) {
                System.out.println("Formateringsfeil! '" + tallstrenger[i] + "' er ikke et tall.");
            }
        }
    }
}