ymmällään tökkii Henkilotunnus-luokka on OK
Miksi en voi testiluokassa(alla) suoraan tulostaa sPaiva muuttujaa? testi3 luokan viimeinen rivi
import java.util.*;
import java.util.regex.*;
public class Henkilotunnus extends Tunnus
{
private Calendar SyntymaAika = null;
private String Hetu = null;
/**
* Oletusmuodostin.
*
* @param sTunnus Henkilotunnus muotoa "ppkkvv[ -]tttt".
*/
public Henkilotunnus(String sTunnus)
{
if (!onOikein(sTunnus))
throw new IllegalArgumentException("Henkilötunnus ei ole oikein: " sTunnus);
String sPaiva = sTunnus.substring(0, 2);
String sKuukausi = sTunnus.substring(2, 4);
String sVuosi = sTunnus.substring(4, 6);
char chErotin = sTunnus.charAt(6);
if (chErotin == ' ')
sVuosi = "18" sVuosi;
else if (chErotin == '-')
sVuosi = "19" sVuosi;
else
sVuosi = "20" sVuosi;
GregorianCalendar cal = new GregorianCalendar(
Integer.parseInt(sVuosi),
Integer.parseInt(sKuukausi) - 1,
Integer.parseInt(sPaiva));
this.SyntymaAika = cal;
this.Hetu = sTunnus;
}
/**
* Tarkistaa, onko merkkijonona annettu henkilötunnus oikein.
*
* @param sTunnus Tutkittava tunnus.
*
* @return True, jos tunnus oli oikein, false muutoin.
*/
public static boolean onOikein(String sTunnus)
{
return(Pattern.matches("\\d{6}[ -]\\d{3}\\w{1}", sTunnus));
}
/**
* Palauttaa henkilötunnuksen.
*
* @return Tunnus.
*/
public String kysyKaikki()
{
return(this.Hetu);
}
/**
* Palauttaa henkilötunnuksen merkkijonomuodossa.
*
* @return Henkilötunnus.
*/
public String toString()
{
return("Henkilotunnus(" this.Hetu ")");
}
}
import java.util.*;
import java.util.regex.*;
public class Testi3
{
public static void main(String[] args)
{
System.out.println("Anna henkilötunnus! ");
String henkilotunnusTesti = Lue.rivi();
System.out.println(Henkilotunnus.onOikein(henkilotunnusTesti));
Henkilotunnus tamaTunnus = new Henkilotunnus(henkilotunnusTesti);
System.out.println(tamaTunnus.kysySyntymaAika());
System.out.println(tamaTunnus.kysyKaikki());
System.out.println(sPaiva); //miksei tämä toimi näin????????????????????????
}
}
Miksi en voi testiluokassa(alla) suoraan tulostaa sPaiva muuttujaa? testi3 luokan viimeinen rivi
import java.util.*;
import java.util.regex.*;
public class Henkilotunnus extends Tunnus
{
private Calendar SyntymaAika = null;
private String Hetu = null;
/**
* Oletusmuodostin.
*
* @param sTunnus Henkilotunnus muotoa "ppkkvv[ -]tttt".
*/
public Henkilotunnus(String sTunnus)
{
if (!onOikein(sTunnus))
throw new IllegalArgumentException("Henkilötunnus ei ole oikein: " sTunnus);
String sPaiva = sTunnus.substring(0, 2);
String sKuukausi = sTunnus.substring(2, 4);
String sVuosi = sTunnus.substring(4, 6);
char chErotin = sTunnus.charAt(6);
if (chErotin == ' ')
sVuosi = "18" sVuosi;
else if (chErotin == '-')
sVuosi = "19" sVuosi;
else
sVuosi = "20" sVuosi;
GregorianCalendar cal = new GregorianCalendar(
Integer.parseInt(sVuosi),
Integer.parseInt(sKuukausi) - 1,
Integer.parseInt(sPaiva));
this.SyntymaAika = cal;
this.Hetu = sTunnus;
}
/**
* Tarkistaa, onko merkkijonona annettu henkilötunnus oikein.
*
* @param sTunnus Tutkittava tunnus.
*
* @return True, jos tunnus oli oikein, false muutoin.
*/
public static boolean onOikein(String sTunnus)
{
return(Pattern.matches("\\d{6}[ -]\\d{3}\\w{1}", sTunnus));
}
/**
* Palauttaa henkilötunnuksen.
*
* @return Tunnus.
*/
public String kysyKaikki()
{
return(this.Hetu);
}
/**
* Palauttaa henkilötunnuksen merkkijonomuodossa.
*
* @return Henkilötunnus.
*/
public String toString()
{
return("Henkilotunnus(" this.Hetu ")");
}
}
import java.util.*;
import java.util.regex.*;
public class Testi3
{
public static void main(String[] args)
{
System.out.println("Anna henkilötunnus! ");
String henkilotunnusTesti = Lue.rivi();
System.out.println(Henkilotunnus.onOikein(henkilotunnusTesti));
Henkilotunnus tamaTunnus = new Henkilotunnus(henkilotunnusTesti);
System.out.println(tamaTunnus.kysySyntymaAika());
System.out.println(tamaTunnus.kysyKaikki());
System.out.println(sPaiva); //miksei tämä toimi näin????????????????????????
}
}
Vastaukset 5
Vanhimmat
koko Testi3-luokassa ei ole tuollaista sPaiva-muuttujaa edes määritelty, niin miksi sen pitäisi osata se tulostaa? Main-metodi on vielä itse luokasta irrallinen metodi, niin tuo sPaiva pitäisi olla main-metodissa esitelty muuttuja. Näin tuo koodi toimisi.
public class Testi3
{
public static void main(String[] args)
{
String sPaiva="";
System.out.println("Anna henkilötunnus! ");
String henkilotunnusTesti = Lue.rivi();
System.out.println(Henkilotunnus.onOikein(henkilotunnusTesti));
Henkilotunnus tamaTunnus = new Henkilotunnus(henkilotunnusTesti);
System.out.println(tamaTunnus.kysySyntymaAika());
System.out.println(tamaTunnus.kysyKaikki());
System.out.println(sPaiva); //miksei tämä toimi näin????????????????????????
}
}
Oletan kuitenkin että haluaisit tulostaa sPaiva-muuttujan sisällön Henkilotunnus-luokasta. Sitä voisit toki kutsua näin:
System.out.println(tamaTunnus.sPaiva);
mutta silloin tuo muuttuja pitäisi olla määriteltynä julkiseksi Henkilotunnus-luokan alussa näin:
public class Henkilotunnus extends Tunnus
{
private Calendar SyntymaAika = null;
private String Hetu = null;
public String sPaiva = "";
Tällä hetkellä se on määriteltynä vain Henkilotunnus-luokan konstruktorin sisällä. Muualla se ei ole voimassa.
Lopuksi vielä neuvoisin, että et käytä julkisia muuttujia luokissasi kuin ihan pakosta. Julkisia muuttujia pääsee kuka vain sorkkimaan ja ehkä tunkemaan niihin ties mitä arvoiksi.
Määrittele muuttujat privaateiksi ja tee niiden käsittelyyn julkiset metodit. Näissä metodeissa sitten voi tarkistaa, että varmasti laitetaan muuttujaan oikeaa tietoa.
Esim.
public class Kuukaudet
{
private int kuukausi=0;
public Kuukaudet()
{
this.kuukausi = 1;
}
public int getKuukausi()
{
return this.kuukausi;
}
public void setKuukausi(int kk)
{
//tarkistetaan annetun kuukauden laillisuus
if(kk>0 && kk
kiitoksia ehkä tämä tästä
haluaisin allaolevan tarkistuksen osaksi tuon äskeisen Henkilötunnus-luokan onOikea-metodia
jokin tässä private-public- konstruktori asiassa ei ole auennut minulle ainakaan vielä
eli miten?
private final static char[] TARKISTUSMERKKI =
{'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','H','J','K','L',
'M','N','P','R','S','T','U','V','W','X','Y'};
String sJaettava = sTunnus.substring(0, 6) sTunnus(7, 10);
int iJaettava = Integer.parseInt(sJaettava);
int iJakojaannos = iJaettava1;
boolean bOk = =(TARKISTUSMERKKI[iJakojaannos]== sTunnus.charAt(10));
muutos vain onOikea-metodiin
(huolimattomuusvirheitä oli edellisessä paljon, stressi painaa
public static boolean onOikein(String sTunnus)
{
String sJaettava = sTunnus.substring(0, 6) sTunnus.substring(7, 10);
int iJaettava = Integer.parseInt(sJaettava);
int iJakojaannos = iJaettava1;
boolean bOk =(TARKISTUSMERKKI[iJakojaannos]== sTunnus.charAt(10));
return(Pattern.matches("\\d{6}[ -]\\d{3}\\w{1}", sTunnus)&&bOk);
}
Se Henkilotunnus-luokan poikkeus pitäisi käsitellä siellä tsetissä jotenkin.
muuten kai OK!
> public static boolean onOikein(String sTunnus)
> "\\d{6}[ -]\\d{3}\\w{1}"
Ei tunnista 2000-luvulla syntyneitä, joiden hetun erotinmerkki on 'A'.
>* Oletusmuodostin.
>* @param sTunnus Henkilotunnus muotoa "ppkkvv[ -]tttt".
Oletusmuodostimella ei ole parametreja.
> System.out.println(sPaiva); //miksei tämä toimi näin????????????????????????
Missä sPaiva on määritelty?