|
|
- # 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;
- }
- }
- }
- ```
|