Java fundamentals through coding exercises
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

4.9 KiB

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