Zdrojový kód z prednášky 14.12.2011

Kontrolovaná výnimka NazovPrazdnyException v balíčku sk.upjs.paz.filmy (súbor NazovPrazdnyException.java)

package sk.upjs.paz.filmy;

public class NazovPrazdnyException extends Exception {
}

Nekontrolovaná výnimka KonstruktorMaZlyNazovSuboruException v balíčku sk.upjs.paz.filmy (súbor KonstruktorMaZlyNazovSuboruException.java)

package sk.upjs.paz.filmy;

public class KonstruktorMaZlyNazovSuboruException extends RuntimeException {

        public KonstruktorMaZlyNazovSuboruException() {
                super();
                // TODO Auto-generated constructor stub
        }

        public KonstruktorMaZlyNazovSuboruException(String arg0, Throwable arg1,
                        boolean arg2, boolean arg3) {
                super(arg0, arg1, arg2, arg3);
                // TODO Auto-generated constructor stub
        }

        public KonstruktorMaZlyNazovSuboruException(String arg0, Throwable arg1) {
                super(arg0, arg1);
                // TODO Auto-generated constructor stub
        }

        public KonstruktorMaZlyNazovSuboruException(String arg0) {
                super(arg0);
                // TODO Auto-generated constructor stub
        }

        public KonstruktorMaZlyNazovSuboruException(Throwable arg0) {
                super(arg0);
                // TODO Auto-generated constructor stub
        }
}

Interfejs ZoznamFilmov v balíčku sk.upjs.paz.filmy (súbor ZoznamFilmov.java)

package sk.upjs.paz.filmy;

public interface ZoznamFilmov {

        public void vypisVsetko();
        public void vypisPodlaZanru(String zaner);
        /**
         * Metóda vloží nový film do zoznamu. Ak vo vloženom filme je prázdny názov filmu,
         * vyhodí sa výnimka NazovPrazdnyException.
         *
         * throws tu musí byť uvedené, lebo v aspoň jednej implementujúcej triede v
         * tejto metóde chceme takúto výnimku vyhadzovať.
         *
         * @param dvd
         * @throws NazovPrazdnyException
         */

        public void vlozNovyFilm(Film dvd) throws NazovPrazdnyException;
        public void vymazFilm(String nazovFilmu);

        /**
         * Metóda uloží zoznam do úložiska. Ak nepoznáme v niektorej z implementujúcich tried v tejto
         * metóde z nejakého dôvodu súbor, do ktorého chceme ukladať, vyhodíme výnimku
         * KonstruktorMaZlyNazovSuboruException.
         *
         * throws tu musí byť uvedené, lebo v aspoň jednej implementujúcej triede v
         * tejto metóde chceme takúto výnimku vyhadzovať.
         *
         * @throws KonstruktorMaZlyNazovSuboruException
         */

        public void ulozSa() throws KonstruktorMaZlyNazovSuboruException;
        public void utriedPodlaNazvu();
        public void utriedPodlaDlzky();
        public void utriedPodlaHodnotenia();
}

Trieda TextovyZoznamFilmov v balíčku sk.upjs.paz.filmy (súbor TextovyZoznamFilmov.java)

package sk.upjs.paz.filmy;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;

import sk.upjs.paz.filmy.komparatory.FilmPodlaDlzkyComparator;
import sk.upjs.paz.filmy.komparatory.FilmPodlaHodnoteniaComparator;

public class TextovyZoznamFilmov implements ZoznamFilmov {

        private Film[] filmy;
        private String nazovSuboru;

        /**
         * Konštruktor vytvára nový zoznam filmov. Ak súbor, ktorého názov je na
         * vstupe, neexistuje, vyhodíme výnimku
         * KonstruktorMaZlyNazovSuboruException.
         *
         * @param nazovSuboru
         *            Názov súboru, do ktorého budeme zoznam ukladať.
         * @throws KonstruktorMaZlyNazovSuboruException
         */

        public TextovyZoznamFilmov(String nazovSuboru)
                        throws KonstruktorMaZlyNazovSuboruException {
                this();
                File subor = new File(nazovSuboru);
                if (!subor.exists()) {
                        throw new KonstruktorMaZlyNazovSuboruException();
                }
                this.nazovSuboru = nazovSuboru;
                nacitajSa(nazovSuboru);
        }

        public TextovyZoznamFilmov() {
                filmy = new Film[0];
        }

        /**
         * Metóda vloží nový film do zoznamu. Ak vo vloženom filme je prázdny názov filmu,
         * vyhodí sa výnimka NazovPrazdnyException.
         *
         * @param dvd
         * @throws NazovPrazdnyException
         */

        public void vlozNovyFilm(Film dvd) throws NazovPrazdnyException {
                if (dvd.getNazovFilmu().length()==0) {
                        throw new NazovPrazdnyException();
                }              
                Film[] novePole = new Film[filmy.length + 1];
                System.arraycopy(filmy, 0, novePole, 0, filmy.length);
                novePole[filmy.length] = dvd;
                filmy = novePole;
        }

        public void vypisVsetko() {
                for (int i = 0; i < filmy.length; i++) {
                        System.out.println(filmy[i].toString());
                }
        }

        public void vypisPodlaZanru(String zaner) {
                for (int i = 0; i < filmy.length; i++) {
                        if (filmy[i].mamZaner(zaner)) {
                                System.out.println(filmy[i]);
                                System.out.println("=====================");
                        }
                }
        }

        private void vymazFilm(Film dvd) {
                Film[] novePole = new Film[filmy.length - 1];
                int pozicia = 0;
                while (filmy[pozicia] != dvd) {
                        if (pozicia == novePole.length) {
                                return;
                        }
                        novePole[pozicia] = filmy[pozicia];
                        pozicia++;
                }
                for (int i = pozicia + 1; i < filmy.length; i++) {
                        novePole[i - 1] = filmy[i];
                }
                filmy = novePole;
        }

        public void vymazFilm(String nazovFilmu) {
                int pozicia = 0;
                while ((pozicia < filmy.length)
                                && (!filmy[pozicia].getNazovFilmu().equals(nazovFilmu))) {
                        pozicia++;
                }
                if ((pozicia < filmy.length))
                        vymazFilm(filmy[pozicia]);
        }

        /**
         * metóda uloží celý zoznam filmov do súboru, každý film sa zapisuje sám
         *
         * @param subor
         * @throws FileNotFoundException
         * @throws KonstruktorMaZlyNazovSuboruException
         */

        private void ulozSa(String subor) throws FileNotFoundException,
                        KonstruktorMaZlyNazovSuboruException {
                // if (nazovSuboru == null) {
                // throw new
                // KonstruktorMaZlyNazovSuboruException("Súbor "+subor+", do ktorého chcem ukladať, neexistuje. "
                // +
                // "Zoznam vyrábaj s konštruktorom, ktorý má názov súboru");
                // }
                File f;
                try {
                        f = new File(subor);
                } catch (NullPointerException e) {
                        throw new KonstruktorMaZlyNazovSuboruException("Súbor, "
                                        + "do ktorého chcem ukladať, nebol zadaný. "
                                        + "Zoznam skús vyrábať s konštruktorom, ktorý má názov súboru", e);
                }
                PrintWriter pw = null;
                pw = new PrintWriter(f);
                pw.println(filmy.length);
                for (int i = 0; i < filmy.length; i++) {
                        filmy[i].ulozSa(pw);
                }
                pw.close();
        }

        /**
         * metóda načíta celý zoznam filmov zo súboru
         * každý film si prečíta hodnoty a naplní svoje inštančné premenné sám
         * cez príslušný konštruktor
         *
         * @param subor Názov súboru z ktorého sa má načítať zoznam.
         */

        public void nacitajSa(String subor) {
                File f = new File(subor);
                Scanner citac = null;
                filmy = new Film[0];
                try {
                        citac = new Scanner(f);
                        int dlzkaDb = citac.nextInt();
                        citac.nextLine();
                        for (int i = 0; i < dlzkaDb; i++) {
                                String typMedia = citac.nextLine();
                                if (typMedia.equals("dvd")) {
                                        vlozNovyFilm(new FilmNaDvd(citac));
                                }
                                if (typMedia.equals("paska")) {
                                        vlozNovyFilm(new FilmNaPaske(citac));
                                }
                                if (typMedia.equals("pc")) {
                                        vlozNovyFilm(new FilmVPocitaci(citac));
                                }
                        }
                } catch (FileNotFoundException e) {
                        System.err.println("Subor neviem precitat, zoznam filmov je prazdny.");
                } catch (NazovPrazdnyException e) {
                        System.err.println("Načítal som súbor s prázdnum názvom.");
                } finally {
                        if (citac != null) {
                                citac.close();
                        }
                }
        }

        /**
         * Metóda uloží zoznam do úložiska. Ak nemáme v inštančnej premennej nazovSuboru
         * súbor, do ktorého chceme ukladať, vyhodíme výnimku KonstruktorMaZlyNazovSuboruException.
         *
         * @throws KonstruktorMaZlyNazovSuboruException
         */

        @Override
        public void ulozSa() throws KonstruktorMaZlyNazovSuboruException {
                try {
                        ulozSa(nazovSuboru);
                } catch (FileNotFoundException e) {
                        throw new KonstruktorMaZlyNazovSuboruException("Nazov suboru "
                                        + nazovSuboru + " definovany v konstruktore niekto zmazal",
                                        e);
                }
        }

        @Override
        public void utriedPodlaNazvu() {
                Arrays.sort(filmy);
        }

        @Override
        public void utriedPodlaDlzky() {
                Arrays.sort(filmy, new FilmPodlaDlzkyComparator());
        }

        @Override
        public void utriedPodlaHodnotenia() {
                Arrays.sort(filmy, new FilmPodlaHodnoteniaComparator());

        }
}

Trieda SpustacZoSuboru ukazujúca vyhodenie výnimky KonstruktorMaZlyNazovSuboruException.

package sk.upjs.paz.filmy;

public class SpustacZoSuboru {

        public static void main(String[] args) {
                ZoznamFilmov filmy = new TextovyZoznamFilmov();
                try {
                        filmy.ulozSa();
                } catch (KonstruktorMaZlyNazovSuboruException e) {
                        System.err.println("Nastala výnimka KonstruktorMaZlyNazovSuboruException so správou :" + e.getMessage());
                        System.err.println("Dôvod výnimky, ak existuje:" + e.getCause());
                }
                filmy.vypisVsetko();
        }
}