tökkii perusteellisesti

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????????????????????????

}
}
5608
Äänestä

Muut lukivat myös

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

Äänestä
  • 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));

    Äänestä

  • samaHarjoituksentekija kirjoitti:

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

    Äänestä

  • samaHarj kirjoitti:

    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!

    Äänestä

> 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?

Äänestä

Kommentoi aloitusta


Harjoituksentekijä kirjoitti:

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????????????????????????

}
}

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu