# Kello ja poikkeukset ## 1. Kello-luokka Kirjoita luokka `Kello`. Kello-luokassa on oltava seuraavat ominaisuudet: - yksityiset oliomuuttujat `tunnit` (int) ja `minuutit` (int) - konstruktori `Kello(int tunnit, int minuutit)`, joka asettaa annetut arvot oliomuuttujiin - getterit ja setterit molemmille oliomuuttujille - `public void lisaaMinuutit(int mins)` -metodi, joka kasvattaa kellonaikaa annettujen minuuttien verran. Jos minuutit ovat lisäyksen jälkeen 60 tai yli, kasvatetaan myös tunteja siten, että minuuttiosuus pysyy aina välillä 0 ≤ minuutit ≤ 59. Jos vastaavasti tunnit ovat lisäyksen jälkeen 24 tai enemmän, pyörähtää kello ympäri ja tunnit alkavat jälleen nollasta. - `toString`-metodi, joka palauttaa kellonajan merkkijonoesityksen muodossa "22:52". Jos kellonajan minuutit ovat alle 10, tulee minuuttien edessä olla etunolla, esim. "0:06". ## 2. Parametriarvojen tarkastaminen ja poikkeusten heittäminen Toteuta `Kello`-luokkaan tarkastukset, joissa tarkastetaan, että luokalle annetut tunnit ovat väliltä `0` ≤ tunnit ≤ `23` ja minuutit väliltä `0` ≤ minuutit ≤ `59`. Mikäli kellolle annetaan aika sallitun välin ulkopuolelta, tulee sen heittää `IllegalArgumentException`-poikkeus. Joudut huomioimaan oikeellisen ajan tarkastamisen sekä konstruktorissa että set-metodeissa. Tarkasta myös `lisaaMinuutit`-metodissa, että kelloon ei yritetä lisätä negatiivista aikaa. Mikäli lisättävät minuutit on negatiivinen luku, heitä `IllegalArgumentException`. `IllegalArgumentException`-luokan konstruktorille tulee antaa parametrina virheilmoitus. Tämän tehtävän kannalta ei ole merkitystä, minkä virheviestin annat poikkeuksille, esim: ``` throw new IllegalArgumentException("Virheellinen kellonaika"); ``` Tässä tehtävässä sinun ei tarvitse toteuttaa tekstikäyttöliittymää, mutta sinun kannattaa testata luokkasi erillisellä main-metodilla. ## ESIMERKKI ``` === Suoritettava testikoodi === public class KelloTest { public static void main(String[] args) { Kello kello = new Kello(22, 12); System.out.println(kello); kello.lisaaMinuutit(40); System.out.println(kello); kello.lisaaMinuutit(29); System.out.println(kello); kello.lisaaMinuutit(45); System.out.println(kello); } } === Ohjelman tulosteet === 22:12 22:52 23:21 0:06 ``` **Kello.java** ``` public class Kello { private int tunnit, minuutit; private static int hour_min = 0; private static int hour_max = 23; private static int mins_min = 0; private static int mins_max = 59; public void setTunnit(int tunnit) { this.tarkistaKello(tunnit,hour_min,hour_max); this.tunnit = tunnit; } public void setMinuutit(int minuutit) { this.tarkistaKello(minuutit, mins_min, mins_max); this.minuutit = minuutit; } public int getTunnit(){ return this.tunnit; } public int getMinuutit() { return this.minuutit; } public void lisaaMinuutit(int mins) throws IllegalArgumentException { // kasvattaa kellonaikaa annettujen minuuttien verran // jos minuutit yli 60, kasvattaa tunteja siten, että minuutit pysyvät välillä 0-59 // // jos tunnit ovat lisäyksen jälkeen 24 tai enemmän, "pyörähtää kello ympäri" ja // tunnit alkavat jälleen nollasta. if (mins < 0) { throw new IllegalArgumentException("Virheellinen minuuttiarvo"); } this.minuutit += mins; if (this.minuutit > 60) { // kokonaiset tunnit kaikista minuuteista int hours = (int)((double)this.minuutit/60.0); this.tunnit += hours; // (minuutit/60 - kokonaiset tunnit) * 60 = jäljelle jäävät minuutit this.minuutit = (int)((((double)this.minuutit/60.0) - hours) * 60); } if (this.tunnit >= 24) { this.tunnit = 0; } } public Kello(int tunnit, int minuutit) { // konstruktori, joka asettaa annetut arvot (tunnit, minuutit) oliomuuttujiin 'tunnit' ja 'minuutit' this.tarkistaKello(minuutit, mins_min, mins_max); this.tarkistaKello(tunnit,hour_min,hour_max); this.setTunnit(tunnit); this.setMinuutit(minuutit); } private void tarkistaKello(int tyyppi, int min, int max) { if (!(tyyppi >= min && tyyppi <= max)) { throw new IllegalArgumentException("Virheellinen kellonaika"); } } @Override public String toString() { // palauttaa kellonajan merkkijonoesityksen muodossa "22:52" // jos minuutit alle 10, tulee minuuttien edessä olla etunolla, esim. "0:06". if (this.minuutit < 10) { return this.tunnit + ":" + "0" + this.minuutit; } else { return this.tunnit + ":" + this.minuutit; } } } ```