tökkii perusteellisesti

Harjoituksentekijä

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

}
}

5

587

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Piru

      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

      • samaHarjoituksentekija

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


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


      • SivullinenZZZ
        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!


    • mikrotukihenkilo

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

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Räppäri kuoli vankilassa

      Ei kuulemma ole tapahtunut rikosta. Sama vahinkohan kävi Epsteinille. https://www.hs.fi/suomi/art-2000011840869.html "
      Maailman menoa
      87
      4098
    2. Välillä kyllä tuntuu, että jaat vihjeitä

      Mutta miten niistä voi olla ollenkaan varma? Ja minä saan niistä kimmokkeen luulemaan yhtä sun toista. Eli mitä ajatella
      Ikävä
      24
      2911
    3. No kyllä te luuserit voitte tehdä mitä vaan keskenänne, sitä en ymmärrä miksi pelaat,nainen

      Pisteesi silmissäni, edes ystävätasolla tippui jo tuhannella, kun sain selville pelailusi, olet toisen kanssa, vaikka ol
      Ikävä
      45
      2320
    4. Missä näitte viimeksi?

      Missä näit kaivattua viimeksi ja oliko sähköä ilmassa?
      Ikävä
      34
      1321
    5. Puukotus yöllä

      Oli kaveri hermostunut ja antanut puukosta.
      Sotkamo
      10
      909
    6. 131
      885
    7. rakas J siellä jossain

      Niin ikävä sua. -P. Nainen
      Ikävä
      6
      874
    8. Masan touhut etenee

      Punatiilitalon tietotoimiston mukaan Masa on saanut viimein myytyä kämppänsä ja kaavoittaa uudelle lukaalille tonttia pa
      Äänekoski
      12
      822
    9. Naisten ja miesten tasoeroista

      Oletteko huomanneet, että naisissa ylemmän tason naiset ovat sinkkuja, ja miehissä alemman tason incelit? Toimivat paris
      Ikävä
      124
      766
    10. You've been running and

      so has your mind, I'm thinking of you all the time... 💘
      Ikävä
      11
      760
    Aihe