ongelmia syöttötietojen lukemisessa

hyppää yhden yli

Pieni ongelma:

kysyn ensin ikää (int), sitten etunimeä (String), sitten sukunimeä (String).

Kun olen syöttänyt tuon iän, niin seuraava kysymys onkin jo tuo sukunimi. Ikään kuin Enterin painallus aiheuttaa tuon toisen kysymyksen kuittaantumisen.

Mikä avuksi? Kysymykset on omissa metodeissa ja käytän int "MUUTTUJA"=lukija.next"TYYPPI"();

23

696

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • iiiiiiiiiiiiiooooooo

      Itse ajatuksessa ei pitäisi olla mitään ongelmaa, sillä alla oleva esimerkki ainakin toimii. Jos et käytä Scanneria, niin vika voi olla siinä että nextInt lukee syötteestä pelkästään luvun, jolloin syötteeseen jää rivinvaihto, ja tämän takia etunimi kysymys näyttää valahtavan läpi, koska se saa rivin vaihdon. Tällöin ongelma ratkaistaan lukemalla rivinvaihto syötteestä pois, eli lisäämällä sen nextInt käskyn jälkeen yksi nextLine tms. komento joka lukee syötteestä rivin vaihdon pois.


      --- ALKAA ---

      import java.util.Scanner;

      public class Esimerkki {
         public static void main(String[] args) {
            Scanner lukija = new Scanner(System.in);
            
            System.out.print("Anna ikä: ");
            int ikä = lukija.nextInt();
            
            System.out.print("Etunimi: ");
            String etunimi = lukija.next();
            
            System.out.print("Sukunimi: ");
            String sukunimi = lukija.next();
            
            System.out.println(
                  "Olet: " etunimi " " sukunimi
                  " (" ikä "v)"
            );
         }
      }

      --- LOPPUU ---

      • ei toimi enää

        Eli teepä vaika noille oma luokka TietojenKysyminen ja molemmille omat metodit KysyIkää ja KysyNimeä.

        Tällöin tuo "ominaisuus" tulee esiin. Ja kun on pitänyt palaustustyyppi laittaa, niin miten sitten luet sieltä pois sen rivinvaihto merkin sieltä pois kun ei voi laittaa erityyppistä lukijaa (nextLine)?


      • tee vain metodit se riittää
        ei toimi enää kirjoitti:

        Eli teepä vaika noille oma luokka TietojenKysyminen ja molemmille omat metodit KysyIkää ja KysyNimeä.

        Tällöin tuo "ominaisuus" tulee esiin. Ja kun on pitänyt palaustustyyppi laittaa, niin miten sitten luet sieltä pois sen rivinvaihto merkin sieltä pois kun ei voi laittaa erityyppistä lukijaa (nextLine)?

        Korjaus äskeiseen tee vain kaikille erilliset metodit jossa kysytään ikä, etunimi, sukunimi.

        Kysy ikää ensin (koska on int) sitten seuraavaksi etunimi ja lopuksi sukunimi. Tulee esiin sama hyppääminen etunimen yli kun saa sen returnin vissiin sinne talteen.


      • iiiiiiiiiiiiiooooooo
        ei toimi enää kirjoitti:

        Eli teepä vaika noille oma luokka TietojenKysyminen ja molemmille omat metodit KysyIkää ja KysyNimeä.

        Tällöin tuo "ominaisuus" tulee esiin. Ja kun on pitänyt palaustustyyppi laittaa, niin miten sitten luet sieltä pois sen rivinvaihto merkin sieltä pois kun ei voi laittaa erityyppistä lukijaa (nextLine)?

        Ihan hyvin tuo kuitenkin tuntuu toimivan.

        --- ALKAA ---

        import java.util.Scanner;

        public class Esimerkki {

           static Scanner lukija = new Scanner(System.in);

           public static int kysyIkä() {
              System.out.print("Anna ikä: ");
              return lukija.nextInt();
           }
           
           public static String kysyEtunimi() {
              System.out.print("Etunimi: ");
              return lukija.next();
           }
           
           public static String kysySukunimi() {
              System.out.print("Sukunimi: ");
              return lukija.next();      
           }
           
           public static void main(String[] args) {
              int ikä = kysyIkä();
              String etunimi = kysyEtunimi();
              String sukunimi = kysySukunimi();
              
              System.out.println(
                    "Olet: " etunimi " " sukunimi
                    " (" ikä "v)"
              );
           }
        }


        --- LOPPUU ---


        Miten luet pois? Vaikka seruaavasti, riippuen siitä tukeeko lukijasi nextLine komentoa, (kai siinä joku vastaava komento kuitenkin on jolla saa luettua rivin vaihdon pois, vaikkapa sitten getLine).

        --- ALKAA ---

           public static int kysyIkä() {
              System.out.print("Anna ikä: ");
              int ikä = lukija.nextInt();
              lukija.nextLine();
              return ikä;
           }

        --- LOPPUU ---


      • kohta sukunimi on tuossa jo...
        iiiiiiiiiiiiiooooooo kirjoitti:

        Ihan hyvin tuo kuitenkin tuntuu toimivan.

        --- ALKAA ---

        import java.util.Scanner;

        public class Esimerkki {

           static Scanner lukija = new Scanner(System.in);

           public static int kysyIkä() {
              System.out.print("Anna ikä: ");
              return lukija.nextInt();
           }
           
           public static String kysyEtunimi() {
              System.out.print("Etunimi: ");
              return lukija.next();
           }
           
           public static String kysySukunimi() {
              System.out.print("Sukunimi: ");
              return lukija.next();      
           }
           
           public static void main(String[] args) {
              int ikä = kysyIkä();
              String etunimi = kysyEtunimi();
              String sukunimi = kysySukunimi();
              
              System.out.println(
                    "Olet: " etunimi " " sukunimi
                    " (" ikä "v)"
              );
           }
        }


        --- LOPPUU ---


        Miten luet pois? Vaikka seruaavasti, riippuen siitä tukeeko lukijasi nextLine komentoa, (kai siinä joku vastaava komento kuitenkin on jolla saa luettua rivin vaihdon pois, vaikkapa sitten getLine).

        --- ALKAA ---

           public static int kysyIkä() {
              System.out.print("Anna ikä: ");
              int ikä = lukija.nextInt();
              lukija.nextLine();
              return ikä;
           }

        --- LOPPUU ---

        import java.util.Scanner;

        public class EsimerkkiEsimerkki {

        static Scanner lukija = new Scanner(System.in);

        public static int kysyIkä() {
        System.out.print("Anna ikä: ");
        int ikä=lukija.nextInt();
        return ikä;


        }

        public static String kysyEtunimi() {
        System.out.print("Etunimi: ");
        String etunimi=lukija.nextLine();

        return etunimi;
        }

        public static String kysySukunimi() {
        System.out.print("Sukunimi: ");
        return lukija.next();
        }

        public static void main(String[] args) {
        int ikä = kysyIkä();
        String etunimi = kysyEtunimi();
        String sukunimi = kysySukunimi();

        System.out.println(
        "Olet: " etunimi " " sukunimi
        " (" ikä "v)"
        );
        }
        }

        /*Tässä kyllä saa taas vaihteeksi ihmetellä tuota opetuksen tasoa meidän amk:ssa kun opetetaan jotensakin vaikeimmalla tavalla ja päin helvettiä noita asioita

        Sinun tapa:

        public static int kysyIkä() {
        System.out.print("Anna ikä: ");
        return lukija.nextInt();
        }

        Minulle opetettu tapa:

        public static int kysyIkä() {
        System.out.print("Anna ikä: ");
        int ikä=lukija.nextInt();
        return ikä;
        }

        Joka siis aiheuttaa jostain syystä tuon ongelman. En tiedä miten helvetissä tuo voi toimia jotenkin erilailla. Ja miksi minun tavassa ihan turhaan

        int ikä=lukija.nextInt();
        return ikä;

        jos sen kerta voi tehdä suoraan

        return lukija.nextInt();

        Onko tuo sinulle opetettu tapa vai oletko jostain muualta sen oppinut? Kirjassakin on tuolla tavalla kuten minä olen tehnyt. Helvetti soikoon, paljon paremmin oppisi kun lukisi teidän osaavien koodeja ja kattelisi sieltä mallia miten ne oikein kannattaa tehdä. Koko ajan törmää erilaisiin ongelmiin kun tekee kuten opetettu/kirjassa ja sitten joku esim. täällä neuvoo eri tavalla, yksinkertaisemmin ja ilman ongelmia.

        Vissiin ne jotka ei osaa, opettaa. Vai miten se sananlasku menikään.


      • ongelmahan johtuu tästä
        kohta sukunimi on tuossa jo... kirjoitti:

        import java.util.Scanner;

        public class EsimerkkiEsimerkki {

        static Scanner lukija = new Scanner(System.in);

        public static int kysyIkä() {
        System.out.print("Anna ikä: ");
        int ikä=lukija.nextInt();
        return ikä;


        }

        public static String kysyEtunimi() {
        System.out.print("Etunimi: ");
        String etunimi=lukija.nextLine();

        return etunimi;
        }

        public static String kysySukunimi() {
        System.out.print("Sukunimi: ");
        return lukija.next();
        }

        public static void main(String[] args) {
        int ikä = kysyIkä();
        String etunimi = kysyEtunimi();
        String sukunimi = kysySukunimi();

        System.out.println(
        "Olet: " etunimi " " sukunimi
        " (" ikä "v)"
        );
        }
        }

        /*Tässä kyllä saa taas vaihteeksi ihmetellä tuota opetuksen tasoa meidän amk:ssa kun opetetaan jotensakin vaikeimmalla tavalla ja päin helvettiä noita asioita

        Sinun tapa:

        public static int kysyIkä() {
        System.out.print("Anna ikä: ");
        return lukija.nextInt();
        }

        Minulle opetettu tapa:

        public static int kysyIkä() {
        System.out.print("Anna ikä: ");
        int ikä=lukija.nextInt();
        return ikä;
        }

        Joka siis aiheuttaa jostain syystä tuon ongelman. En tiedä miten helvetissä tuo voi toimia jotenkin erilailla. Ja miksi minun tavassa ihan turhaan

        int ikä=lukija.nextInt();
        return ikä;

        jos sen kerta voi tehdä suoraan

        return lukija.nextInt();

        Onko tuo sinulle opetettu tapa vai oletko jostain muualta sen oppinut? Kirjassakin on tuolla tavalla kuten minä olen tehnyt. Helvetti soikoon, paljon paremmin oppisi kun lukisi teidän osaavien koodeja ja kattelisi sieltä mallia miten ne oikein kannattaa tehdä. Koko ajan törmää erilaisiin ongelmiin kun tekee kuten opetettu/kirjassa ja sitten joku esim. täällä neuvoo eri tavalla, yksinkertaisemmin ja ilman ongelmia.

        Vissiin ne jotka ei osaa, opettaa. Vai miten se sananlasku menikään.

        Ongelmahan on sittekin siinä seuraavassa (toisessa) kohdassa eli kysyEtunimi.

        Sinulla:

        public static String kysyEtunimi() {
        System.out.print("Etunimi: ");
        return lukija.next(); //HUOM
        }

        Minulla;

        public static String kysyEtunimi() {
        System.out.print("Etunimi: ");
        String etunimi=lukija.nextLine(); //HUOM
        return etunimi; //HUOM
        }

        eli mitä tuossa on nyt toiminnan kannalta erilailla.


      • iiiiiiiiiiiiiooooooo
        kohta sukunimi on tuossa jo... kirjoitti:

        import java.util.Scanner;

        public class EsimerkkiEsimerkki {

        static Scanner lukija = new Scanner(System.in);

        public static int kysyIkä() {
        System.out.print("Anna ikä: ");
        int ikä=lukija.nextInt();
        return ikä;


        }

        public static String kysyEtunimi() {
        System.out.print("Etunimi: ");
        String etunimi=lukija.nextLine();

        return etunimi;
        }

        public static String kysySukunimi() {
        System.out.print("Sukunimi: ");
        return lukija.next();
        }

        public static void main(String[] args) {
        int ikä = kysyIkä();
        String etunimi = kysyEtunimi();
        String sukunimi = kysySukunimi();

        System.out.println(
        "Olet: " etunimi " " sukunimi
        " (" ikä "v)"
        );
        }
        }

        /*Tässä kyllä saa taas vaihteeksi ihmetellä tuota opetuksen tasoa meidän amk:ssa kun opetetaan jotensakin vaikeimmalla tavalla ja päin helvettiä noita asioita

        Sinun tapa:

        public static int kysyIkä() {
        System.out.print("Anna ikä: ");
        return lukija.nextInt();
        }

        Minulle opetettu tapa:

        public static int kysyIkä() {
        System.out.print("Anna ikä: ");
        int ikä=lukija.nextInt();
        return ikä;
        }

        Joka siis aiheuttaa jostain syystä tuon ongelman. En tiedä miten helvetissä tuo voi toimia jotenkin erilailla. Ja miksi minun tavassa ihan turhaan

        int ikä=lukija.nextInt();
        return ikä;

        jos sen kerta voi tehdä suoraan

        return lukija.nextInt();

        Onko tuo sinulle opetettu tapa vai oletko jostain muualta sen oppinut? Kirjassakin on tuolla tavalla kuten minä olen tehnyt. Helvetti soikoon, paljon paremmin oppisi kun lukisi teidän osaavien koodeja ja kattelisi sieltä mallia miten ne oikein kannattaa tehdä. Koko ajan törmää erilaisiin ongelmiin kun tekee kuten opetettu/kirjassa ja sitten joku esim. täällä neuvoo eri tavalla, yksinkertaisemmin ja ilman ongelmia.

        Vissiin ne jotka ei osaa, opettaa. Vai miten se sananlasku menikään.

        Kuten jo sanoin, niin ongelma on se ettet lue rivin vaihtoa pois, ennen kuin pyydät seuraava riviä, jolloin luonnolliseesti saat tyhjän rivin. Eli lue se rivin vaihto pois, jos tiedät sen toimivan erottimena:

        --- ALKAA ---

        public static int kysyIkä() {
           System.out.print("Anna ikä: ");
           int ikä = lukija.nextInt();
           lukija.nextLine();
           return ikä;
        }


        --- LOPPUU ---


        Ongelmasi on se, ettet ota huomioon sitä, että nextInt -kutsu lukee pois virrasta vain numeron, ei sen numeron jälkeen tulevaa rivin vaihtoa tai muutakaan erotin merkkiä. Jos siis syötteesi on:

        "20MATTI MASA>"

        Tuosta kun luet nextInt -kutsulla pois numeron, niin sen jälkeen virrassa onkin:

        "MATTI MASA"

        Tämän jälkeen ohjelmasi pyytää kohdassa kysyEtunimi, lukijaa lukemaan rivin nextLine käskyllä. Tämä luonnollisesti palauttaa tyhjän rivin, koska nextLine käsky lukee virrasta kaikki merkit rivin vaihtomerkkiin asti, (ja eihän ennen rivin vaihtoa merkkiä virrassa ole muita merkkejä).


      • iiiiiiiiiiiiiooooooo
        ongelmahan johtuu tästä kirjoitti:

        Ongelmahan on sittekin siinä seuraavassa (toisessa) kohdassa eli kysyEtunimi.

        Sinulla:

        public static String kysyEtunimi() {
        System.out.print("Etunimi: ");
        return lukija.next(); //HUOM
        }

        Minulla;

        public static String kysyEtunimi() {
        System.out.print("Etunimi: ");
        String etunimi=lukija.nextLine(); //HUOM
        return etunimi; //HUOM
        }

        eli mitä tuossa on nyt toiminnan kannalta erilailla.

        Ero on siinä että next käsky lukee seuraavan merkkijonon, jonka eroittimena toimii rivin vaihtoon tai välilyönti, eikä se voi olla tyhjä. nextLine lukee taas rivin, eli se loppuu rivin vaihtoon ja voi olla myös tyhjä. Esim. tuossa ensimmäisessä esimerkissäni oleva koodiin voi ikä kenttään syöttää suoraan tekstin "20 matti meikäläinen" jolloin kaikki menevät oikein, mutta toisaalta taas siihen ei voi syöttää kaksi-osaista etunimeä koska silloin toinen osa valahtaa sukunimeksi.

        Lyhyesti siis, rivi: "matti meikäläinen", sisältää kaksi merkkijonoa, ja jos alat lukemaan sitä next käskkyllä, niin ensimmäinen kutsu kerta palauttaa merkkijonon "matti" ja toinen kutsu kerta merkkijonon "meikäläinen". Jos taas luet kyseisen rivin nextLine käskyllä niin se palauttaa heti ensinmäisellä kutsu kerralla: "matti meikäläinen".


      • i'll be back
        iiiiiiiiiiiiiooooooo kirjoitti:

        Kuten jo sanoin, niin ongelma on se ettet lue rivin vaihtoa pois, ennen kuin pyydät seuraava riviä, jolloin luonnolliseesti saat tyhjän rivin. Eli lue se rivin vaihto pois, jos tiedät sen toimivan erottimena:

        --- ALKAA ---

        public static int kysyIkä() {
           System.out.print("Anna ikä: ");
           int ikä = lukija.nextInt();
           lukija.nextLine();
           return ikä;
        }


        --- LOPPUU ---


        Ongelmasi on se, ettet ota huomioon sitä, että nextInt -kutsu lukee pois virrasta vain numeron, ei sen numeron jälkeen tulevaa rivin vaihtoa tai muutakaan erotin merkkiä. Jos siis syötteesi on:

        "20MATTI MASA>"

        Tuosta kun luet nextInt -kutsulla pois numeron, niin sen jälkeen virrassa onkin:

        "MATTI MASA"

        Tämän jälkeen ohjelmasi pyytää kohdassa kysyEtunimi, lukijaa lukemaan rivin nextLine käskyllä. Tämä luonnollisesti palauttaa tyhjän rivin, koska nextLine käsky lukee virrasta kaikki merkit rivin vaihtomerkkiin asti, (ja eihän ennen rivin vaihtoa merkkiä virrassa ole muita merkkejä).

        Ok. Pitää yrittää ymmärtää tuo ja muistaa se jatkossakin. (Miksiköhän tuota ei ole tehty siten että se Int ollessa kyseessä poistaisi automaattisesti tuon rivinvaihdon?)

        Kiitoksia avusta. Toivottavasti jaksat auttaa jatkossakin. Varmaan jo viimeistään huomenna olen täällä kyselemässä asioita...
        -----
        Seuraava ongelma näyttäisi olevan selainen että noi samat on omassa luokassa. Pääohjelmassa kyselen noita ja ne pitäisi saada vielä Henkilöt -olioon (ikä,etunimi,sukunimi), jonka tiedot pitäisi sitten vielä tallentaa tiedostoon ja lukea sieltä ulos ja tulostaa.

        Ongelmana on nyt etten saa noita kysyttyjä tietoja Henkilöt oliolle siitä syystä että ne ovat tuolla omasssa luokassa.

        Olen saman tapaisen kerran tehnyt pois lukien , jossa nuo kysymykset olivat metodeina pääohjelman kanssa samassa luokassa...


      • iiiiiiiiiiiiiiooooooo
        i'll be back kirjoitti:

        Ok. Pitää yrittää ymmärtää tuo ja muistaa se jatkossakin. (Miksiköhän tuota ei ole tehty siten että se Int ollessa kyseessä poistaisi automaattisesti tuon rivinvaihdon?)

        Kiitoksia avusta. Toivottavasti jaksat auttaa jatkossakin. Varmaan jo viimeistään huomenna olen täällä kyselemässä asioita...
        -----
        Seuraava ongelma näyttäisi olevan selainen että noi samat on omassa luokassa. Pääohjelmassa kyselen noita ja ne pitäisi saada vielä Henkilöt -olioon (ikä,etunimi,sukunimi), jonka tiedot pitäisi sitten vielä tallentaa tiedostoon ja lukea sieltä ulos ja tulostaa.

        Ongelmana on nyt etten saa noita kysyttyjä tietoja Henkilöt oliolle siitä syystä että ne ovat tuolla omasssa luokassa.

        Olen saman tapaisen kerran tehnyt pois lukien , jossa nuo kysymykset olivat metodeina pääohjelman kanssa samassa luokassa...

        """Miksiköhän tuota ei ole tehty siten että se Int ollessa kyseessä poistaisi automaattisesti tuon rivinvaihdon?"""

        nextInt -metodi ei erikseen erottele onko kyseessä rivinvaihto vaiko joku muu laillinen erotin, (esim. välilyönti, tabulaattori, tms.). Erottimenhan voi määritellä useDelimer käskyllä. Ehkä siis sen takia, että se mitä tulee itse numeron jälkeen voi kuulua jollekin muulle, ja tämän takia nextInt, yms. metodit ei poista "numeron" jälkeen tulevaa erotinta.

        Voisithan myös rakentaa etu ja sukunimi metodin alla olevan kaltaisesti, eli olla hyväksymättä tyhjiä rivejä, ja poistaa tyhjät merkit rivin alusta ja lopusta, niin tällöin kysyIkä metodiin ei tarvitsisi lisätä nextLine käskyä ja kaupan päälle saisit nimet joista olisi edestä ja lopusta karsittu tyhjät merkit pois. Tosin kaikkein paras olisi jos nimi tarkastettaisiin oikein kunnolla, niin ettei esim. numeroa hyväksyttäisi nimeksi.

        --- ALKAA ---

        public static String kysyEtunimi() {
           String etunimi;
           
           System.out.print("Etunimi: ");
           do {
              etunimi = lukija.nextLine().trim();
           } while(etunimi.equals(""));

           return etunimi;
        }

        --- LOPPUU ---




        """Seuraava ongelma näyttäisi olevan selainen että noi samat on omassa luokassa. Pääohjelmassa kyselen noita ja ne pitäisi saada vielä Henkilöt -olioon (ikä,etunimi,sukunimi), jonka tiedot pitäisi sitten vielä tallentaa tiedostoon ja lukea sieltä ulos ja tulostaa.""""

        Tietojen viemiseen olioon on monta tapaa, riippuen siitä miten luokka on tehty. Alla kolme eri lähestymistapaa tuohon tietojen vientiin oliolle:

        Henkilö henkilö = new Henkilö(ikä, etunimi, sukunimi); // Luonnin yhteydessä
        henkilö.asetaIkä(24); // Jälkeenpäin metodin välityksellä
        henkilö.ikä = 24; // Jälkeenpäin muuttujaa sorkkimalla

        Vastaavasti tietojen tallentamiseen ja lukemiseen on monta tapaa. Yksi on tallentaa koko olio sellaisenaan, ja yksi on erikseen tallentamaan vain haluttuja tietoja. Olion tulostamisenkin voi hoitaa, joko antamalla olion tulostaa itse itsensä, tai hakea tiedot oliolta ja tulostaa ne itse. Alla yksi esimerkki (koostuu kahdesta tiedostosta) jossa tiedot välitetään oliolle alustuksen yhteydessä, olio tallennetaan tiedostoon kokonaisuudessan, ja olion annetaan tulostaa itse itsensä. Kokeile toki valita hajoituksen vuoksi valita joku muukin lähestymis tapa.



        --- ALKAA: Henkilö.java ---

        import java.io.Serializable;

        public class Henkilö implements Serializable {
           
           private static final long serialVersionUID
              = 6042687952003168195L;
           
           private   int      ikä;
           private   String   etunimi;
           private   String   sukunimi;
           
           public Henkilö(int ikä, String etunimi, String sukunimi) {
              this.ikä = ikä;
              this.sukunimi = sukunimi;
              this.etunimi = etunimi;
           }
           
           public String toString() {
              return etunimi " " sukunimi " (" ikä ")";
           }
        }

        --- LOPPUU: Henkilö.java ---


        --- ALKAA: Esimerkki.java ---

        import java.io.*;
        import java.util.Scanner;

        public class Esimerkki {
           static Scanner lukija = new Scanner(System.in);

           public static int kysyIkä() {
              System.out.print("Anna ikä: ");
              int ikä = lukija.nextInt();
              lukija.nextLine();
              return ikä;
           }

           public static String kysyEtunimi() {
              System.out.print("Etunimi: ");
              return lukija.nextLine().trim();
           }

           public static String kysySukunimi() {
              System.out.print("Sukunimi: ");
              return lukija.nextLine().trim();
           }

           public static void main(String[] args) throws
              FileNotFoundException, IOException, ClassNotFoundException
           {
              // Kysytään tiedot
              int ikä = kysyIkä();
              String etunimi = kysyEtunimi();
              String sukunimi = kysySukunimi();

              // Luodaan olio, ja välitetän tiedot luonnin yhteydessä
              Henkilö henkilö = new Henkilö(ikä, etunimi, sukunimi);
              
              // Talleenetaa olio tiedostoon
              ObjectOutputStream out =
                 new ObjectOutputStream(new FileOutputStream("teso.dat"));
              out.writeObject(henkilö);
              out.close();

              // Luetaan olio tiedostosta
              ObjectInputStream in =
                 new ObjectInputStream(new FileInputStream("teso.dat"));
              Henkilö henkilöLuettu = (Henkilö) in.readObject();
              in.close();
              
              // Tulostetaan luettu olio
              System.out.println(henkilöLuettu);
           }
        }

        --- LOPPUU: Esimerkki.java ---


      • tästä on hyvä lähteä
        iiiiiiiiiiiiiiooooooo kirjoitti:

        """Miksiköhän tuota ei ole tehty siten että se Int ollessa kyseessä poistaisi automaattisesti tuon rivinvaihdon?"""

        nextInt -metodi ei erikseen erottele onko kyseessä rivinvaihto vaiko joku muu laillinen erotin, (esim. välilyönti, tabulaattori, tms.). Erottimenhan voi määritellä useDelimer käskyllä. Ehkä siis sen takia, että se mitä tulee itse numeron jälkeen voi kuulua jollekin muulle, ja tämän takia nextInt, yms. metodit ei poista "numeron" jälkeen tulevaa erotinta.

        Voisithan myös rakentaa etu ja sukunimi metodin alla olevan kaltaisesti, eli olla hyväksymättä tyhjiä rivejä, ja poistaa tyhjät merkit rivin alusta ja lopusta, niin tällöin kysyIkä metodiin ei tarvitsisi lisätä nextLine käskyä ja kaupan päälle saisit nimet joista olisi edestä ja lopusta karsittu tyhjät merkit pois. Tosin kaikkein paras olisi jos nimi tarkastettaisiin oikein kunnolla, niin ettei esim. numeroa hyväksyttäisi nimeksi.

        --- ALKAA ---

        public static String kysyEtunimi() {
           String etunimi;
           
           System.out.print("Etunimi: ");
           do {
              etunimi = lukija.nextLine().trim();
           } while(etunimi.equals(""));

           return etunimi;
        }

        --- LOPPUU ---




        """Seuraava ongelma näyttäisi olevan selainen että noi samat on omassa luokassa. Pääohjelmassa kyselen noita ja ne pitäisi saada vielä Henkilöt -olioon (ikä,etunimi,sukunimi), jonka tiedot pitäisi sitten vielä tallentaa tiedostoon ja lukea sieltä ulos ja tulostaa.""""

        Tietojen viemiseen olioon on monta tapaa, riippuen siitä miten luokka on tehty. Alla kolme eri lähestymistapaa tuohon tietojen vientiin oliolle:

        Henkilö henkilö = new Henkilö(ikä, etunimi, sukunimi); // Luonnin yhteydessä
        henkilö.asetaIkä(24); // Jälkeenpäin metodin välityksellä
        henkilö.ikä = 24; // Jälkeenpäin muuttujaa sorkkimalla

        Vastaavasti tietojen tallentamiseen ja lukemiseen on monta tapaa. Yksi on tallentaa koko olio sellaisenaan, ja yksi on erikseen tallentamaan vain haluttuja tietoja. Olion tulostamisenkin voi hoitaa, joko antamalla olion tulostaa itse itsensä, tai hakea tiedot oliolta ja tulostaa ne itse. Alla yksi esimerkki (koostuu kahdesta tiedostosta) jossa tiedot välitetään oliolle alustuksen yhteydessä, olio tallennetaan tiedostoon kokonaisuudessan, ja olion annetaan tulostaa itse itsensä. Kokeile toki valita hajoituksen vuoksi valita joku muukin lähestymis tapa.



        --- ALKAA: Henkilö.java ---

        import java.io.Serializable;

        public class Henkilö implements Serializable {
           
           private static final long serialVersionUID
              = 6042687952003168195L;
           
           private   int      ikä;
           private   String   etunimi;
           private   String   sukunimi;
           
           public Henkilö(int ikä, String etunimi, String sukunimi) {
              this.ikä = ikä;
              this.sukunimi = sukunimi;
              this.etunimi = etunimi;
           }
           
           public String toString() {
              return etunimi " " sukunimi " (" ikä ")";
           }
        }

        --- LOPPUU: Henkilö.java ---


        --- ALKAA: Esimerkki.java ---

        import java.io.*;
        import java.util.Scanner;

        public class Esimerkki {
           static Scanner lukija = new Scanner(System.in);

           public static int kysyIkä() {
              System.out.print("Anna ikä: ");
              int ikä = lukija.nextInt();
              lukija.nextLine();
              return ikä;
           }

           public static String kysyEtunimi() {
              System.out.print("Etunimi: ");
              return lukija.nextLine().trim();
           }

           public static String kysySukunimi() {
              System.out.print("Sukunimi: ");
              return lukija.nextLine().trim();
           }

           public static void main(String[] args) throws
              FileNotFoundException, IOException, ClassNotFoundException
           {
              // Kysytään tiedot
              int ikä = kysyIkä();
              String etunimi = kysyEtunimi();
              String sukunimi = kysySukunimi();

              // Luodaan olio, ja välitetän tiedot luonnin yhteydessä
              Henkilö henkilö = new Henkilö(ikä, etunimi, sukunimi);
              
              // Talleenetaa olio tiedostoon
              ObjectOutputStream out =
                 new ObjectOutputStream(new FileOutputStream("teso.dat"));
              out.writeObject(henkilö);
              out.close();

              // Luetaan olio tiedostosta
              ObjectInputStream in =
                 new ObjectInputStream(new FileInputStream("teso.dat"));
              Henkilö henkilöLuettu = (Henkilö) in.readObject();
              in.close();
              
              // Tulostetaan luettu olio
              System.out.println(henkilöLuettu);
           }
        }

        --- LOPPUU: Esimerkki.java ---

        Kiitoksia. Tuosta on hyvä lahteä tekemään, tai no tuo taitaa toimia jo tuollaisenaan. Lupaan pähkäillä asiaa enkä pelkästään copy-pasteta ja teen joitain muutoksia, jos tuo vain sallii sen.


      • iiiiiiiiiiiiiiooooooo
        tästä on hyvä lähteä kirjoitti:

        Kiitoksia. Tuosta on hyvä lahteä tekemään, tai no tuo taitaa toimia jo tuollaisenaan. Lupaan pähkäillä asiaa enkä pelkästään copy-pasteta ja teen joitain muutoksia, jos tuo vain sallii sen.

        Jos tuo on koulutehtävä, eikä teille ole Serializable:a opetettu, niin silloin kannattaa tehdä tietojen tallennus ja luku siihen tyyliin kuin se on opetettu. Eli käyttää harjoituksessa niitä luokkia ja metodeita jotka on käyty läpi tunnilla.

        Vaikka Serializablen writeObject:n käyttö on nopein ja yksinkertaisin tapa toteuttaa tehtävän anto, niin oppimistarkoituksessa se on kaikkein huonoin valinta. Tämä siitä syystä, että erittäin harvoin paikalliset ohjelmat tallentavat tietonsa tuohon tyyliin, erinäisistä syistä johtuen (esim. ei haluta tallentaa koko oliota vaan tietyt tiedot olion sisältä, tiedostoa halutaan pystyä muokkaamaan tekstieditorilla ja tehdä siitä helposti luettava jollakin muulla ohjelmalla, halutut tiedot on monen olion sisällä, yms. syystä johtuen).


      • miten vien aliohjelmaan
        iiiiiiiiiiiiiiooooooo kirjoitti:

        """Miksiköhän tuota ei ole tehty siten että se Int ollessa kyseessä poistaisi automaattisesti tuon rivinvaihdon?"""

        nextInt -metodi ei erikseen erottele onko kyseessä rivinvaihto vaiko joku muu laillinen erotin, (esim. välilyönti, tabulaattori, tms.). Erottimenhan voi määritellä useDelimer käskyllä. Ehkä siis sen takia, että se mitä tulee itse numeron jälkeen voi kuulua jollekin muulle, ja tämän takia nextInt, yms. metodit ei poista "numeron" jälkeen tulevaa erotinta.

        Voisithan myös rakentaa etu ja sukunimi metodin alla olevan kaltaisesti, eli olla hyväksymättä tyhjiä rivejä, ja poistaa tyhjät merkit rivin alusta ja lopusta, niin tällöin kysyIkä metodiin ei tarvitsisi lisätä nextLine käskyä ja kaupan päälle saisit nimet joista olisi edestä ja lopusta karsittu tyhjät merkit pois. Tosin kaikkein paras olisi jos nimi tarkastettaisiin oikein kunnolla, niin ettei esim. numeroa hyväksyttäisi nimeksi.

        --- ALKAA ---

        public static String kysyEtunimi() {
           String etunimi;
           
           System.out.print("Etunimi: ");
           do {
              etunimi = lukija.nextLine().trim();
           } while(etunimi.equals(""));

           return etunimi;
        }

        --- LOPPUU ---




        """Seuraava ongelma näyttäisi olevan selainen että noi samat on omassa luokassa. Pääohjelmassa kyselen noita ja ne pitäisi saada vielä Henkilöt -olioon (ikä,etunimi,sukunimi), jonka tiedot pitäisi sitten vielä tallentaa tiedostoon ja lukea sieltä ulos ja tulostaa.""""

        Tietojen viemiseen olioon on monta tapaa, riippuen siitä miten luokka on tehty. Alla kolme eri lähestymistapaa tuohon tietojen vientiin oliolle:

        Henkilö henkilö = new Henkilö(ikä, etunimi, sukunimi); // Luonnin yhteydessä
        henkilö.asetaIkä(24); // Jälkeenpäin metodin välityksellä
        henkilö.ikä = 24; // Jälkeenpäin muuttujaa sorkkimalla

        Vastaavasti tietojen tallentamiseen ja lukemiseen on monta tapaa. Yksi on tallentaa koko olio sellaisenaan, ja yksi on erikseen tallentamaan vain haluttuja tietoja. Olion tulostamisenkin voi hoitaa, joko antamalla olion tulostaa itse itsensä, tai hakea tiedot oliolta ja tulostaa ne itse. Alla yksi esimerkki (koostuu kahdesta tiedostosta) jossa tiedot välitetään oliolle alustuksen yhteydessä, olio tallennetaan tiedostoon kokonaisuudessan, ja olion annetaan tulostaa itse itsensä. Kokeile toki valita hajoituksen vuoksi valita joku muukin lähestymis tapa.



        --- ALKAA: Henkilö.java ---

        import java.io.Serializable;

        public class Henkilö implements Serializable {
           
           private static final long serialVersionUID
              = 6042687952003168195L;
           
           private   int      ikä;
           private   String   etunimi;
           private   String   sukunimi;
           
           public Henkilö(int ikä, String etunimi, String sukunimi) {
              this.ikä = ikä;
              this.sukunimi = sukunimi;
              this.etunimi = etunimi;
           }
           
           public String toString() {
              return etunimi " " sukunimi " (" ikä ")";
           }
        }

        --- LOPPUU: Henkilö.java ---


        --- ALKAA: Esimerkki.java ---

        import java.io.*;
        import java.util.Scanner;

        public class Esimerkki {
           static Scanner lukija = new Scanner(System.in);

           public static int kysyIkä() {
              System.out.print("Anna ikä: ");
              int ikä = lukija.nextInt();
              lukija.nextLine();
              return ikä;
           }

           public static String kysyEtunimi() {
              System.out.print("Etunimi: ");
              return lukija.nextLine().trim();
           }

           public static String kysySukunimi() {
              System.out.print("Sukunimi: ");
              return lukija.nextLine().trim();
           }

           public static void main(String[] args) throws
              FileNotFoundException, IOException, ClassNotFoundException
           {
              // Kysytään tiedot
              int ikä = kysyIkä();
              String etunimi = kysyEtunimi();
              String sukunimi = kysySukunimi();

              // Luodaan olio, ja välitetän tiedot luonnin yhteydessä
              Henkilö henkilö = new Henkilö(ikä, etunimi, sukunimi);
              
              // Talleenetaa olio tiedostoon
              ObjectOutputStream out =
                 new ObjectOutputStream(new FileOutputStream("teso.dat"));
              out.writeObject(henkilö);
              out.close();

              // Luetaan olio tiedostosta
              ObjectInputStream in =
                 new ObjectInputStream(new FileInputStream("teso.dat"));
              Henkilö henkilöLuettu = (Henkilö) in.readObject();
              in.close();
              
              // Tulostetaan luettu olio
              System.out.println(henkilöLuettu);
           }
        }

        --- LOPPUU: Esimerkki.java ---

        System.out.println(henkilöLuettu);
        ----
        minkä tyyppinen tuo henkilöLuettu on? (Olio?)

        miten vien sen aliohjelmalle. miten annan sen parametrinä?


      • iiiiiiiiiiiiiooooooooooooo
        miten vien aliohjelmaan kirjoitti:

        System.out.println(henkilöLuettu);
        ----
        minkä tyyppinen tuo henkilöLuettu on? (Olio?)

        miten vien sen aliohjelmalle. miten annan sen parametrinä?

        Muutama rivi kyseisen rivin yläpuoella on rivi:

           Henkilö henkilöLuettu = (Henkilö) in.readObject();

        Kyseinen henkilöLuettu olio kuuluu siis Henkilö luokkaan. Se miten se viedään aliohjelmaan ja miten se annetaan parametrenia on käytännössä yksi ja sama kysymys. Esim. pritln aliohjelmaan kyseinen olio viedään kirjoittamallasi rivillä:

           System.out.println(henkilöLuettu);

        Jos tarkoitit miten tehdään metodi/aliohjelma jolle voi välittää kyseiseen luokkaan kuuluvan olion, niin se tehdään esim. seuraavasti:

           public void puhu(Henkilö puhuja) {
              System.out.println(puhuja.etunimi " puhuu");
           }



        Javassa luokka määritellään alla olevan kaltaisesti, (eli sitä ennen on aina class -sana):

           class Henkilö {
              // Koodia
           }

        Kun luokka on määritelty, voi sitä sen jälkeen käyttää koodissa. Esim. alla oleva koodi esittelee 3 Henkilö luokan oliota, (esittely tapahtuu kirjoittamalla luokan nimi ja sen jälkeen olion nimi):

           Henkilö maija;
           Henkilö matti;
           Henkilö minni;

        Yllä oleva koodi ei varsinaisesti luo olioita vaan kertoo kääntäjälle, että maija, matti ja minni ovat Henkilö luokkaan kuuluvia olioita. Tämän jälkeen kyseiset oliot voidaan varsinaisesti luoda/alusta (luonti varaa oliolle olion tarvitseman muistin ja alustaa sen), esim. seuraavasti:

           maija = new Henkilö();
           matti = new Henkilö();
           minni = new Henkilö();

        Olio voidaan luoda myös esittelyn yhteydessä yhdistämällä esittely ja sijoitus lause:

           Henkilö maija = new Henkilö();
           Henkilö matti = new Henkilö();
           Henkilö minni = new Henkilö();

        Koodatessa kannattaa noudattaa jotakin ulkoasu sääntöä, esim. käyttää luokkien nimessä aina suurta alkukirjainta ja vastaavasti olioiden nimissä pientä alkukirjainta.


      • yritin viedä henkilöLuettu ...
        iiiiiiiiiiiiiooooooooooooo kirjoitti:

        Muutama rivi kyseisen rivin yläpuoella on rivi:

           Henkilö henkilöLuettu = (Henkilö) in.readObject();

        Kyseinen henkilöLuettu olio kuuluu siis Henkilö luokkaan. Se miten se viedään aliohjelmaan ja miten se annetaan parametrenia on käytännössä yksi ja sama kysymys. Esim. pritln aliohjelmaan kyseinen olio viedään kirjoittamallasi rivillä:

           System.out.println(henkilöLuettu);

        Jos tarkoitit miten tehdään metodi/aliohjelma jolle voi välittää kyseiseen luokkaan kuuluvan olion, niin se tehdään esim. seuraavasti:

           public void puhu(Henkilö puhuja) {
              System.out.println(puhuja.etunimi " puhuu");
           }



        Javassa luokka määritellään alla olevan kaltaisesti, (eli sitä ennen on aina class -sana):

           class Henkilö {
              // Koodia
           }

        Kun luokka on määritelty, voi sitä sen jälkeen käyttää koodissa. Esim. alla oleva koodi esittelee 3 Henkilö luokan oliota, (esittely tapahtuu kirjoittamalla luokan nimi ja sen jälkeen olion nimi):

           Henkilö maija;
           Henkilö matti;
           Henkilö minni;

        Yllä oleva koodi ei varsinaisesti luo olioita vaan kertoo kääntäjälle, että maija, matti ja minni ovat Henkilö luokkaan kuuluvia olioita. Tämän jälkeen kyseiset oliot voidaan varsinaisesti luoda/alusta (luonti varaa oliolle olion tarvitseman muistin ja alustaa sen), esim. seuraavasti:

           maija = new Henkilö();
           matti = new Henkilö();
           minni = new Henkilö();

        Olio voidaan luoda myös esittelyn yhteydessä yhdistämällä esittely ja sijoitus lause:

           Henkilö maija = new Henkilö();
           Henkilö matti = new Henkilö();
           Henkilö minni = new Henkilö();

        Koodatessa kannattaa noudattaa jotakin ulkoasu sääntöä, esim. käyttää luokkien nimessä aina suurta alkukirjainta ja vastaavasti olioiden nimissä pientä alkukirjainta.

        olin oikeilla jäljillä.

        yritin viedä henkilöLuettu tekemääni tulosta-metodiin.

        public void tulosta(henkilöLuettu)

        miksei tuo onnistu, jos sen kerta voi voidaan viedä println-aliohjelmaan. Ei jymmarra.


      • ei toimasta
        yritin viedä henkilöLuettu ... kirjoitti:

        olin oikeilla jäljillä.

        yritin viedä henkilöLuettu tekemääni tulosta-metodiin.

        public void tulosta(henkilöLuettu)

        miksei tuo onnistu, jos sen kerta voi voidaan viedä println-aliohjelmaan. Ei jymmarra.

        teinpä näin

        Henkilö puhuja=new Henkilö(ikä,etunimi,sukunimi);


        System.out.println(puhuja);
        //tulostaa iän, etunimen ja sukunimen

        public void tulosta(Henkilö puhuja)
        //TÄTÄ EI HYVÄKSY

        public void tulosta(Henkilö puhuja) {
        System.out.println(puhuja.etunimi);
        System.out.println(puhuja.sukunimi);
        System.out.println(puhuja.ikä);
        } //poistin Henkilö-luokasta private-näärittelyn, ei erroria


      • että sen pitää olla
        ei toimasta kirjoitti:

        teinpä näin

        Henkilö puhuja=new Henkilö(ikä,etunimi,sukunimi);


        System.out.println(puhuja);
        //tulostaa iän, etunimen ja sukunimen

        public void tulosta(Henkilö puhuja)
        //TÄTÄ EI HYVÄKSY

        public void tulosta(Henkilö puhuja) {
        System.out.println(puhuja.etunimi);
        System.out.println(puhuja.sukunimi);
        System.out.println(puhuja.ikä);
        } //poistin Henkilö-luokasta private-näärittelyn, ei erroria

        ja tarkennukseksi vielä että sen pitää olla tuo tiedostosta otettu "tieto" eli ei missään nimessä suoraan noita ikä, etunimi, sukunimi vaan tiedostoonhan se tallennetaan muotoon

        etunimi " " sukunimi " (" ikä ")";


      • iiiiiiiiiiiiiiiiooooooooooo
        että sen pitää olla kirjoitti:

        ja tarkennukseksi vielä että sen pitää olla tuo tiedostosta otettu "tieto" eli ei missään nimessä suoraan noita ikä, etunimi, sukunimi vaan tiedostoonhan se tallennetaan muotoon

        etunimi " " sukunimi " (" ikä ")";

        Metodia kutsutaan ihan pelkällä nimellä, eli:

           tulosta(puhuja);

        Jos haluat tulostaa tiedot tuossa muodossa kuin esitit, niin silloin se menee alla olevasti:

           public void tulosta(Henkilö puhuja) {
              System.out.println(
                 puhuja.etunimi " "
                 puhuja.sukunimi " (" puhuja.ikä ")"
              );
           }

        Huomaathan että Henkilö -luokassa on metodi nimeltä toString, joka määrää sen mitä tulostetaan kun suoritetaan käsky System.out.println(puhuja). Tuolla muodolla kuitenkaan ei ole mitään tekemistä sen kanssa missä muodossa tieto on tiedostossa, ellei sitä sitten ole tuossa muodossa tiedostoon tallennettu.

        Jos haluat että näytölle tulostetaan samanlainen muoto kuin mitä tiedostossa on, et voi tehdä ohjelmaa sen esimerkin mukaan jonka tein, (siis see jossa oli mukana tiedostoon tallennus ja luku). Koska se esimerkki tallentaa koko objektin joten tiedosto näyttää suunnilleen tältä, (jos siis on syötetty tiedot: 20, matti, meikäläinen):

        " í sr HenkilÃSÛð­C®wà I ikäL etunimit Ljava/lang/String;L sukunimiq ~ xp t mattit meikäläinen"

        Jos tarkoitit että haluat tullostaa tiedostosta luetut arvot, niin silloin ne arvot pitää lukea objektiin ennen tulosta metodin kutsumista (esim. siinä yhdessä esimerkissä asia hoidettiin readObject käskyllä).


      • virhettä pukkaa
        iiiiiiiiiiiiiiiiooooooooooo kirjoitti:

        Metodia kutsutaan ihan pelkällä nimellä, eli:

           tulosta(puhuja);

        Jos haluat tulostaa tiedot tuossa muodossa kuin esitit, niin silloin se menee alla olevasti:

           public void tulosta(Henkilö puhuja) {
              System.out.println(
                 puhuja.etunimi " "
                 puhuja.sukunimi " (" puhuja.ikä ")"
              );
           }

        Huomaathan että Henkilö -luokassa on metodi nimeltä toString, joka määrää sen mitä tulostetaan kun suoritetaan käsky System.out.println(puhuja). Tuolla muodolla kuitenkaan ei ole mitään tekemistä sen kanssa missä muodossa tieto on tiedostossa, ellei sitä sitten ole tuossa muodossa tiedostoon tallennettu.

        Jos haluat että näytölle tulostetaan samanlainen muoto kuin mitä tiedostossa on, et voi tehdä ohjelmaa sen esimerkin mukaan jonka tein, (siis see jossa oli mukana tiedostoon tallennus ja luku). Koska se esimerkki tallentaa koko objektin joten tiedosto näyttää suunnilleen tältä, (jos siis on syötetty tiedot: 20, matti, meikäläinen):

        " í sr HenkilÃSÛð­C®wà I ikäL etunimit Ljava/lang/String;L sukunimiq ~ xp t mattit meikäläinen"

        Jos tarkoitit että haluat tullostaa tiedostosta luetut arvot, niin silloin ne arvot pitää lukea objektiin ennen tulosta metodin kutsumista (esim. siinä yhdessä esimerkissä asia hoidettiin readObject käskyllä).

        tulosta(henkilöluettu);

        EI kelpaa: Non static method.....

        Ihan mikä tahansa laitoin tuohon, vaikka olin
        tehnyt esimerkiksi tuon puhuja olion ja ei kelpaa.

        Aina sama vika: Non static method tulosta(Henkilö)
        Ihme homma, miksi se herjaa tuota noin vaikka laitan tuohon parametriksi minkä tahansa olion.


      • miksi sitä ei voi viedä ali...
        iiiiiiiiiiiiiiiiooooooooooo kirjoitti:

        Metodia kutsutaan ihan pelkällä nimellä, eli:

           tulosta(puhuja);

        Jos haluat tulostaa tiedot tuossa muodossa kuin esitit, niin silloin se menee alla olevasti:

           public void tulosta(Henkilö puhuja) {
              System.out.println(
                 puhuja.etunimi " "
                 puhuja.sukunimi " (" puhuja.ikä ")"
              );
           }

        Huomaathan että Henkilö -luokassa on metodi nimeltä toString, joka määrää sen mitä tulostetaan kun suoritetaan käsky System.out.println(puhuja). Tuolla muodolla kuitenkaan ei ole mitään tekemistä sen kanssa missä muodossa tieto on tiedostossa, ellei sitä sitten ole tuossa muodossa tiedostoon tallennettu.

        Jos haluat että näytölle tulostetaan samanlainen muoto kuin mitä tiedostossa on, et voi tehdä ohjelmaa sen esimerkin mukaan jonka tein, (siis see jossa oli mukana tiedostoon tallennus ja luku). Koska se esimerkki tallentaa koko objektin joten tiedosto näyttää suunnilleen tältä, (jos siis on syötetty tiedot: 20, matti, meikäläinen):

        " í sr HenkilÃSÛð­C®wà I ikäL etunimit Ljava/lang/String;L sukunimiq ~ xp t mattit meikäläinen"

        Jos tarkoitit että haluat tullostaa tiedostosta luetut arvot, niin silloin ne arvot pitää lukea objektiin ennen tulosta metodin kutsumista (esim. siinä yhdessä esimerkissä asia hoidettiin readObject käskyllä).

        Minähän juuri kysyin, että miksei sitä (henkilöLuettu) voi viedä parametrinä erilliseen metodiiin, vaikka sen voi viedä println-metodiin. Eihän minun kannata alkaa, tai edes tarvitse, tekemään mitää uutta jos se kerta on jo tuossa henkilöLuettu oliossa tiedoston sisältö.

        tulosta(henkilöLuettu)-->
        Tulee siis vain erroria : Non static method tulosta(Henkilö) cannot be referenced from a static context


      • metodi
        miksi sitä ei voi viedä ali... kirjoitti:

        Minähän juuri kysyin, että miksei sitä (henkilöLuettu) voi viedä parametrinä erilliseen metodiiin, vaikka sen voi viedä println-metodiin. Eihän minun kannata alkaa, tai edes tarvitse, tekemään mitää uutta jos se kerta on jo tuossa henkilöLuettu oliossa tiedoston sisältö.

        tulosta(henkilöLuettu)-->
        Tulee siis vain erroria : Non static method tulosta(Henkilö) cannot be referenced from a static context

        Joudut muuttamaan tuon tulosta-metodin staatiseksi, eli public static void tulosta(Henkilo henkiloLuettu){
        //taikatemput esim.
        //henkilo.tulostaTiedot();
        }


      • pienestä kiinni
        metodi kirjoitti:

        Joudut muuttamaan tuon tulosta-metodin staatiseksi, eli public static void tulosta(Henkilo henkiloLuettu){
        //taikatemput esim.
        //henkilo.tulostaTiedot();
        }

        Kiitoksia. On se välillä pienestä kiinni. Ei tullut edes mieleen että se voisi johtua tuosta.
        Jaksatko yhtään kertoa miksi se toimii jos on static ja ei toimi jos ei ole. Luulin jotenkin että tuo staticc-määrittely jotenkin ehkä mieluummin rajaisi tuon toimintaa...


      • häm
        pienestä kiinni kirjoitti:

        Kiitoksia. On se välillä pienestä kiinni. Ei tullut edes mieleen että se voisi johtua tuosta.
        Jaksatko yhtään kertoa miksi se toimii jos on static ja ei toimi jos ei ole. Luulin jotenkin että tuo staticc-määrittely jotenkin ehkä mieluummin rajaisi tuon toimintaa...

        Olen huono selittämään, joten toivottavasti tämä auttaa:) http://www.cs.helsinki.fi/u/wikla/Ohjelmointi/Sisalto/4/Luokka.html#43

        Mut lyhyesti staattiset metodit liittyvät itse luokkaan ja ei staattiset luokan ilmentymään eli olioon.


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

    Luetuimmat keskustelut

    1. Miten voi olla muun sukupuolinen?

      Ei mitenkään. Kyllä tämä Euroviisujen voittaja on selvästi poika eikä tyttö, eikä mikään muun sukupuolinen. Olen aina pi
      Maailman menoa
      581
      3571
    2. Tunnustan nyt

      Tykkään katsella sua😍
      Ikävä
      45
      1590
    3. Huomenna teen sen

      Se on nyt päätetty. Pääsen pois tästä epätietosuudesta.
      Ikävä
      52
      1387
    4. Kuka on Suomussalmen rikkain mies?

      Jättäkää nimi pois, mutta antakaa sen verran vinkkiä, ettei erehdystä voi tulla. Ammatti pittää mainita.
      Suomussalmi
      36
      1344
    5. Hakkarainen: persut Venäjän ja Pohjois-Korean tiellä

      Hakkarainen entisenä persujen kärkipoliitikkona tietää, mitä puhuu. https://www.is.fi/politiikka/art-2000010422614.html
      Maailman menoa
      169
      1325
    6. Olipa kärsimystä kuunnella Martinaa huomenta suomessa

      Voi hyvää päivää sitä ulostuloa ja mitä liibalaabaa päästi suustaan. Esim. Kaikki äidit tietää mitä se arki on, what, mu
      Kotimaiset julkkisjuorut
      229
      1259
    7. Volkkari olkoon tunniste....

      Ajattelen sua, en ole unohtanut. Vanhemmalle miehelle...
      Suhteet
      106
      1096
    8. Tiesitkö nainen että olen

      Tavattoman epävarma itsestäni. Pienikin takapakki tahaton tai tahallinen voi särkeä paljon ja vaikuttaa käytökseeni teh
      Ikävä
      47
      1002
    9. Tunnusta pois

      Tykkäät katsella mua
      Ikävä
      60
      942
    10. Fuengirola.fi: Kohuissa rypenyt Jari Sillanpää, 58, harvinaisessa haastattelussa: "Minä haluan..."

      Ex-tangokuningas on kertonut kuulumisiaan Espanjan Aurinkorannikolta. Että ei muuta kuin elämässä etiäpäin, Jari Sillanp
      Kotimaiset julkkisjuorut
      15
      864
    Aihe