wiki:paate11_3
Last modified 7 years ago Last modified on 2011-01-26 21:01:47

Pages linking to paate11_3:
paate11

Ohjelmointi 2 2011 / Pääteohjaus 3

Oppimistavoiteet

  • ohjelman kääntäminen ja ajaminen komentoriviltä
  • ohjelman ajaminen ja debuggaaminen Eclipsellä

Tässä harjoituksessa opittavat asiat tulevat hyödyksi ohjelman koodaamisessa ja testaamisessa. Itse ohjelman suunnittelun kanssa tällä harjoituksella ei ole mitään tekemistä!

Java-ohjelmien editointia ja kääntämistä harjoitellaan komentorivillä (mikä tahansa editori käy, esim. ConTEXT tai Notepad) ja Eclipse 6 sovelluskehittimellä.

1. Ohjelman kirjoittaminen ja kääntäminen

Harjoitellaan aluksi Javan käyttöä komentoriviltä. Kun olet käynyt tehtävän läpi komentorivillä, voit kokeilla samaa Eclipsellä editorin käyttöohjeet.

  1. Aukaise yksi komentoikkuna tuplanäpäyttämällä CMD-ikonia (Command prompt, sijaitsee työpöydällä tai Start-valikossa).
  2. Siirry omaan hakemistoosi (hakemiston paikka on C:\MyTemp\ohj2\tunnus. Käytä CD-komentoa hakemistopuussa liikkumiseen). Jos hakemistoa ei ole, luo hakemisto MD-komennolla.
  3. Katso DIR-komennolla mitä tiedostoja on hakemistossa.
  4. Kirjoita jollakin editorilla seuraava Java-ohjelma nimelle: Jarj2.java (esim. ConTEXTilla käynnistyy komennolla ct Jarj2.java[RET].
  5. Lisää pääohjelman kommentin loppumerkki ja poista ohjelman lopussa oleva kommenttimerkki. Ohjelmassa on virheitä. Tarkoituksena on opetella tulkitsemaan kääntäjän virheilmoituksia. Mitä luulet ohjelman tulostavan?
  6. Tallenna valmis ohjelma (useimmissa editoreissa [Ctrl-S]).
  7. Siirry takaisin komentokehotteeseen ja käännä ohjelma komennolla javac Jarj2.java[RET].
  8. Mikäli sait ohjelman kirjoitettua aivan vastaavasti kuin mallissa, komentokehotteeseen tulee tekstit:
    Jarj2.java:39: unclosed string literal
            s2 = kysy("Anna 2. merkkijono >');
                      ^
    Jarj2.java:39: ';' expected
            s2 = kysy("Anna 2. merkkijono >');
                                              ^
    Jarj2.java:41: not a statement
            if ( s1.compareTo(s2) > 0 ) { // Vaihdetaan merkkijonot tarvittaessa
               ^
    Jarj2.java:41: ';' expected
            if ( s1.compareTo(s2) > 0 ) { // Vaihdetaan merkkijonot tarvittaessa
                                       ^
    Jarj2.java:47: ';' expected
            System.out.println("Jonot " + s1 + ", " + s2 + ".")
                                                               ^
    5 errors
    
  9. Rivin alussa oleva tieto kuvaa tiedostoa ja rivinumeroa, jossa virhe on löytynyt (esim. Jarj2.java-tiedostossa rivillä 40 on löydetty merkkijono, jota ei ole suljettu "-merkillä.
  10. Monissa tekstieditoreissa on toiminto, jonka avulla pääsee määrätylle ohjelmariville. Esim. ConTEXTissa [Ctrl-G] (Edit->Go to...) tuo esiin ikkunan, johon voit syöttää haluamasi rivinumeron. Etsi toiminto tekstieditoristasi ja kokeile sitä.
  11. Siirry ensimmäisen virheen kohdalle ja paina [RET].
  12. Korjaa virhe! Virhe ei välttämättä ole kursorin kohdalla, vaan se vasta paljastuu siinä kohdassa. Sama virhe saattaa poikia useita eri virheilmoituksia!
  13. Käännä ohjelma uudelleen.
  14. Tallenna korjattu ohjelma.
  15. Siirry takaisin komentokehotteeseen ja aja ohjelma komennolla java Jarj2[RET]. Jos virtuaalikone ilmoittaa Exception in thread "main" java.lang.NoClassDefFoundError?: Jarj2, kokeile komentoa java -cp . Jarj2[RET] (tämä varmistaa, että virtuaalikone yrittää etsiä ajettavaa tiedostoa nykyisestä hakemistosta).

Huom. seuraavissa luvuissa esiteltävät sovelluskehittimet voivat helpottaa huomattavasti ohjelman kehitystä (ne eivät kuitenkaan tee ohjelmaa puolestasi!). Esimerkiksi niiden editorit on suunniteltu tukemaan Java-kieltä ja debuggerilla ohjelmaa voi suorittaa rivi kerrallaan seuraten samalla muuttujien arvoja. Lisäksi sovelluksen dokumentaation luonti helpottuu ja editori osaa tarvittaessa näyttää suoraan Java-kielen ja omien sovellusten Javadoc-tietoja ohjelmoinnin aikana.

Tästä huolimatta jokaisen (Java-)ohjelmoijan on osattava tarvittaessa kääntää ohjelmansa komentoriviltä. Sovelluskehitintä ei ole aina saatavilla tai käytössä olevan koneen teho ei riitä kehittimen tehokkaaseen käyttöön (erityisesti Java-kielen sovelluskehittimet vievät hyvin runsaasti koneen tehoja). Sen sijaan J2SDK-kehitysympäristö (software development kit) on saatavilla kaikille Java-kielen tukemille käyttöjärjestelmille ja komennot java, javac ja javadoc toimivat odotetusti.

Java-ohjelmointi onnistuu myös ilman massiivista sovelluskehitintä. Monet tekstieditorit, kuten ConTEXT (ei kuitenkaan Notepad) tukevat Javan syntaksin automaattista värikoodaudausta. Kehittyneemmillä editoreilla (esim. GNU Emacs) voi määritellä myös omia toimintoja, kuten javac-komennon kutsuminen editoitavalle tiedostolle...

2. Eclipse -editorin käyttöohjeita

Eclipse on monikäyttöinen, mutta Java-kielelle alunperin suunniteltu IDE. Se on hyvin taipuvainen ja sitä voidaan käyttää myös esim. c/c++ ohjelmiin, internet sovellusten ja sivujen ja graafisien (widget) ohjelmien tekemiseen. Kaiken lisäksi se on ilmainen!

2.1 Ikkunat

Eclipse -ympäristö projektin aukiollessa on suurinpiirtein seuraavan näköinen :

source:paate/trunk/eclipse.png

Käynnistäessäsi Eclipsen, näet "tervehdys"-ikkunan, josta saat esiin esim. java esimerkkejä, tietoa Eclipsestä ja kaikkea muuta mahdollista.

Myöskin tulee huomata, ettei näkymä välttämättä ole ihan samanlainen kuin ylläolevassa kuvassa. Eclipsessä on erilaisia "näkymiä", joista käyttäjä saa valita mieleisensä(ylläolevassa kuvassa on "Java"-näkymä päällä). Vasemmasta yläkulmasta saat selville mikä näkymä on tällähetkellä päällä. Avatessasi tai luodessasi Java projektin Eclipse kysyy, että vaihdetaanko näkymää toiseen. Vastaa tähän, että kyllä.

Näyttö koostuu siis pääikkunasta, joka sisältää useampia ali-ikkunoita. Ikkunan kokoa voidaan muuttaa hiirellä tarttumalla kiinni ikkunan reunaan, paikkaa tarttumalla ikkunan otsikkopalkkiin.

Ali-ikkunoiden kokoa voidaan muuttaa pääikkunan sisällä tarttumalla ikkunan reunaan. Hiiren kursori muuttuu kaksipäiseksi nuoleksi, kun olet oikealla kohdalla. Kokeile!

Ikkunasta toiseen voidaan siirtyä näpäyttämällä hiirellä ikkunan otsikkoa. Pääset käsiksi yläpalkin nappuloihin joko hiirellä tai painamalla [Ctrl-TAB].

Kooditiedostosta toiseen siirrytään klikkaamalla vastaavan välilehden painiketta koodieditorin yläpuolella tai Package Explorer-valikon kautta ([CTRL-F6] ja [CTRL-SHIFT-F6] tai yleisesti [CTRL-E]).

  1. Avaa haluamasi tiedostot (File->Open external file...)
  2. Kokeile ikkunasta toiseen siirtymistä.

2.2 Menut ja pikanäppäimet

Toimintoja voidaan valita joko hiirellä yläreunasta, tai painamalla [F10]) ja siirtymällä kursorilla halutun toiminnon kohdalle. Toiminto voidaan valita myös painamalla toiminnon korostetua kirjainta (esim. [ALT-E] avaa Edit-valikon). Siis vaihtoehtoja on useita. Aluksi menujen käyttö on näppärää nuolinäppäimillä tai hiirellä, mutta haluttaessa tehokkaampaa toimintaa, kannattaa käyttää suoravalintoja.

Kokeillaan Jarj2.java-ohjelman korjausta ja ajamista edellisen luvun tapaan.

  1. Sulje aiemmin avaamasi tiedostot (File->Close all) ja mahdolliset Eclipsen avoinna olevat (Package explorerissa "avoimet siniset kansiot") projektit (Project->Close project, tämä pitää tehdä kaikille avoinna oleville projekteille, älä tallenna muutoksia.).
  2. Aloitetaan uusi projekti ja määritellään asetukset.
    1. Avaa Project Wizard. (File->New->Project...)
    2. Valitse "Java project"
    3. Anna projektille haluamasi nimi ja varmista, että työhakemistoksi(workspace) tulee alkuperäinen työhakemistosi C:\MyTemp?\ohj2\tunnus
    4. Paina Next. Project Wizard siirtyy projektin asetussivulle(Tai suoraan Finish, kaikki pitäisi oletuksena olla oikein)
    5. Paina Finish. Projekti on luotu.
  3. Lisää Jarj2.java projektiin (File->New->File ja anna sille nimeksi Jarj2.java (varmista, että projektisi on valittu) TAI voit suoraan File->New->Class ja syöttää sinne tiedot).
  4. Muuta Jarj2.java alkuperäiseen muotoonsa, jolloin voit kokeilla kääntäjän virheilmoituksia Eclipsellä.
  5. Jotkut virheet näkyvät jo koodia kirjoittaessasi (jopa ilman kääntämistä!) alhaalla olevassa Problems läpyskässä.
  6. Eclipse yrittää automaattisesti kääntää ohjelmaa taustalla kun joko tallennat tai muutat koodia (JOS Project->Build automaticly on päällä), jos kuitenkaan näin ei ole, käännä ohjelma manuaalisesti (Project->Build All) [CTRL-B].
  7. Virheilmoitukset tulevat ruudun alaosassa olevaan virheikkunaan. Virheikkunan avulla näkee (likimain!) virheiden paikat ohjelmakoodissa. Virheitä voi selata Eclipsessä klikkaamalla hiirellä tullutta virhettä. Voit myös nuolinäppäimillä kursoria ylös tai alaspäin painamalla liikkua virheiden välillä(jos niitä on monta), kun virheikkunassa joku virhe on valittu. Kokeile!
  8. Käyttäessäsi NetBeansia? tai Eclipseä huomaat varmaakin, että värit osoittavat jotakin ohjelmakoodissa. Mitä? Värit auttavat paikallistamaan useita virheitä.
  9. Korjaa ja jatka kunnes kaikki virheet on korjattu (kuten komentorivillä aikaisemmin).
  1. Kokeile ajaa edellisessä luvussa tekemäsi ohjelma kolmella eri tavalla (Paina aina Cancel jos ohjelma ei lähde käyntiin vaan tulee "outo" ikkuna):
    1. Valitse hiirellä menuista Run ja sieltä Run...
    2. Paina [CTRL-F11] ja [R].
    3. Klikkaa Run nappulan("Play"-merkki) oikealla puolella olevaa alaspäin olevaa nuolta ja sieltä Run as->Java Application tai Run valikosta Run as->Java Application.
  2. Mikä edellistä tavoista tuntuu parhaalta?

Huomaa, kun kokeilit ENSIMMÄISELLÄ kerralla ajaa ohjelmaa tavoilla 1 ja 2 niin avautui erillinen ikkuna, tässä ikkunassa pystyt määrittelemään esim. erilaiset testirajapinnat, komentorivin erikoiskomennot ja kaikkia paljon muuta. Kuitenkin kun olet kerran ajanut tavalla 3 Eclipse tekee valmiit "perusasetukset" ohjelmalle, joita kuitenkin pystyt muokkaamaan valikosta Run->Run... ja valitsemalla sieltä projektisi.

Pikanäppäimet nopeuttavat ympäristön käyttöä huomattavasti. Edellä on jo mainittu näistä osa. Täydellisen listan Eclipsen pikanäppäimistä ja niiden käyttötarkoituksesta näet valitsemalla Window-valikosta Preferences ja painat aukeavan ikkunan vasemmasta ylänurkasta Workbench tekstin vasemmalla puolella olevaa + tai - merkkiä niin, että esiin tulee Keys valikko ja painat täten sitä.

Editoriin on siis asetettu valmiiksi useita eri pikanäppäinvaihtoehtoja (vaihtoehdot on tehty muiden editorien pikanäppäinten pohjalta)! Lisäksi käyttäjä voi halutessaan mukauttaa haluamansa pikanäppäimet uudelleen. Tässä vaiheessa lienee kuitenkin parasta poistua muuttamatta mitään [ESC] tai paina Cancel-nappia.

2.3 Kääntäjän ja editorin asetukset

Saat kääntäjän (ja kyseisen projektisi) asetukset esiin siten, että valitset aluksi Package Explorer:sta projektisi ja sen jälkeen Project->Properties. Nyt pitäisi avautua seuraavanlainen ikkuna.

source:paate/trunk/eclopt.png Nyt näet vasemmalla eri kohtien nimet (Info, BeanInfo? Path, Builders, Java Build Path jne). Voit siirtyä kohdista toiseen painamalla eri kohtiin hiirellä tai näppäimistöllä siirtyen aluksi vasemmalle ([TAB] tai [SHIFT-TAB]) ja sitten nuolilla ylös- tai alaspäin. Kokeile!

Huomaa myös, että eri asetuskohtien alta ilmestyy vielä paljon erilaisia asetuksia. Kannattaa tutkia (muttei hirveästi muutella jos ei tiedä mitä tekee) tarkasti mitä kaikkia pystyt projektistasi muuttamaan.

  1. Java-kääntäjälle voidaan asettaa optioita siitä, mistä kääntäjä valittaa. Yleisesti ottaen kannattaa pitää kaikki mahdolliset virheilmoitukset päällä, koska varoitus on käytännössä jotakin vikaa ohjelmassa.
  2. Katso kurssin Wikistä miten Eclipsen asetukset kannattaa laittaa.

2.4 Help-toiminto

  1. Eclipsen ohjelmaympäristöissä on varsin hyvä Help-toiminto. Help valikosta Help Contents saadaan tavallinen Help. Kokeile!
  2. [SHIFT-F2] antaa apua siitä sanasta, jonka kohdalla kursori on(tai minkä tekstin koodista on valinnut). Kokeile vaikkapa sanoihin String, CompareTo? ja return. Avustus palauttaa luokkaan liittyvän JavaDocin?, jos sellainen on saatavilla. Käytä tätä siten, että esim. String sanan kohdalla painat F1 jolloin tulee valikko esiin, ja paina vielä valikosta Javadoc for String kohtaa, niin Eclipse avaa selaimeesi Javadocin Stringistä(Tai suoraan SHIFT-F2.
  3. Tätä käyttäen voidaan yleensä aina löytää syntaksi halutulle käskylle. Myöhemmin tässä ohjauksessa käytetään satunnaislukugeneraattoria Math.random(). Kokeile löytää kutsun syntaksi kirjoittamalla koodiin ylimääräinen Math ja paina ".". Huomaa myös Eclipsen ehdottavan automaattisesti luokkaan liittyviä metodeita koodieditorissa. Muista lopuksi pyyhkiä Math. pois koodista.

2.5 Kääntäjän tekemät tiedostot

  1. Kokeile vielä ohjelman ajoa (Run->Run as...>Java Application). Ohjelman toiminta näkyy ohjelman alaosassa olevasssa ajo-ikkunassa.
  2. Poistu käyttöjärjestelmään ja tarkista, mitä juuri kirjoittamaasi ohjelmaan liittyviä tiedostoja on syntynyt hakemistoosi (ohjelmointiympäristö on todennäköisesti lisännyt uusia tiedostoja komentoriviosuudessa kirjoittamiesi lisäksi ja EHKÄ luonut niille sopivia hakemistoja).
  3. Mieti, mitä varten mikäkin tiedosto on.
  4. Aja vielä (nyt Eclipsellä kääntämäsi) ohjelma kuten ensimmäisessä luvussa.

3. Debuggerin käyttö

Kokeillaan Jarj2-ohjelman ajoa rivi kerrallaan Eclipsen debuggerilla.

  1. Vaihda näkymä debug-näkymäksi
    • NetBeans: vaihda vasemmalla olevalta Explorer-ikkunasta Editing-välilehti Debugging-välilehdeksi.
    • Eclipse: vaihda näkymä debug näkymäksi Window-ylävalikosta Open perspective->Debug
  2. Aja ohjelmaa rivi kerrallaan ([F5] tai [F6], Eclipsessä Run->Debug as->Java Applicaton). Voit myös asettaa koodiin keskeytyskohdan (breakpoint) klikkaamalla koodieditorin vasempaa reunusta haluamasi rivin kohdalta tai näppäimistöllä.
    • NB: [Ctrl-Shift-F8]
    • Eclipse: [CTRL-SHIFT-B]. Valitsemasi rivin kohdalle pitäisi tulla sininen pallukka.
  3. Tarkista, että WATCH-ikkuna on näkyvissä
    • NB: Watch-ikkuna on Debugging-välilehden alin ikkuna.
    • Eclipse: Watch ikkuna on oikeassa ylänurkassa välilehtinimellä Variables
  4. Laita yksi kerrallaan WATCH-ikkunaan muuttujat s1, s2 ja t. Aluksi muuttujien perässä voi olla virheilmoitus jonka pitäisi poistua kun ohjelman suoritus aloitetaan ja muuttujan "elämä alkaa".
    • NB:[Ctrl-Shift-F7].
    • Eclipse: Variables ikkunasta (kun sinne ohjelman ajonaikana ilmestyy muuttujia) oikealla hiirennapilla muutujan päällä ja valikosta Watch)
  5. Laita WATCH-ikkunaan myös ehto s1.compareTo(s2)>0.
    • Eclipse: Window->Show view->Expression -ikkunassa paina hiiren oikeaa nappia ja valikosta Add Watch Expression.
  6. Katso välillä tulostusruutua
    • NB: Process output koodieditorin alapuolella.
    • Eclipse: Alhaalla on Console-välilehti, josta näkee konsolin tulostuksen.
  7. Kokeile uudestaan. Käytä myös kursoriin saakka ajamista (eli siirrä kursori vaikkapa riville s2=t ja paina [F4]. Eclipsessä käytä Breakpointeja).
  8. Siirrä vaihtamisessa suoritettavat lauseet samalle riville: t=s1; s1=s2; s2=t;
    1. Siirry rivin loppuun. ([End])
    2. Poista rivin loppu. ([Del])
    3. Poista seuraava sana. ([Shift-Ctrl-oikea] ja [DEL])
    4. Lisää välilyönti.
  9. Kokeile suoritusta rivi kerrallaan uudelleen, kun ko. lauseet on siirretty.
  1. Kokeile suoritusta rivi kerrallaan käyttämällä nyt näppäintä [F6]. Mitä eroa näppäimeen [F5]?
  2. Lisää ohjelmaan tulostusrivi, joka kertoo ohjelman käyttäjälle mitä ohjelma tekee.
  3. Tallenna ohjelma lopuksi. ([Ctrl-S])

4. Lohkojen käsittely

Harjoitellaan uuden ohjelman kirjoitusta ja leiketaulun käyttöä.

  1. Aloita uusi ohjelma nimeltä Jarj3.java.
    • NB: [Ctrl-N], valitse puusta Java Classes ja Main, Next. Kirjoita Name-kenttään Jarj3 ja valitse puusta työhakemistosi. Paina kolme kertaa Next-nappia ja lopuksi Finish-nappia.
    • Eclipse: [Ctrl-N], valitse puusta Class ja paina Next. Kirjoita Name-kenttään Jarj3. Muokkaa myös Source folder kuntoon, jos se ei ole. Paina Finish-nappia.
  2. Kopioi pohjaksi edellinen ohjelma Jarj2.java.
    1. Aktivoi Jarj2.java-tiedoston ikkuna (Window-valikko, NB:ssä ja Eclipse:ssä myös [ALT-RIGHT] tai [ALT-LEFT]).
    2. Valitse koko tiedosto ([Ctrl-END] ja [Ctrl-SHIFT-HOME], Eclipse:ssä [CTRL-A]).
    3. Kopioi tiedosto leikepöydälle ([Ctrl-Ins] tai [Ctrl-C]).
    4. Huomaa, että uuden luokan nimen on oltava Jarj3!
  3. Tarkoituksena on muuttaa ohjelmaa siten, että järjestetäänkin 3 lukua suuruusjärjestykseen (rivit on numeroitu jotta alla voidaan viitata riveihin; numeroita ei missään tapauksessa kirjoiteta!):
  4. LUE ENNEN KIRJOITTAMISTA HUOLELLISESTI ALLA OLEVAT KIRJOITUSOHJEET!
          01 import java.io.*; // tarvitaan tietojen syöttöön
          02 /**Jarj2
          03  * Ohjelma järjestää kolme merkkijonoa aakkosjärjestykseen
          04  * @author
          05  * @version */
          06 public class Jarj3 {
          07
          08   /**Kysyy käyttäjältä merkkijonon annetulla tulosteella.
          09    *  @param prompt lause, joka käyttäjä näkee ennen tietojen syöttöä
          10    *  @return käyttäjän syöttämä merkkijono ilman rivinvaihtoa */
          11   public static String kysy(String prompt) {
          12     System.out.print(prompt);
          13
          14     // Syöttöpyyntö ja vastauksen lukeminen
          15     BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
          16     try {
          17       return in.readLine();
          18       } catch (IOException ex) { return ""; }
          19   }
          20
          21   /**Pääohjelma
          22    * @param args Komentorivillä annetut parametetrit */
          23   public static void main(String[] args) {
          24     String s1,s2,s3,t;
          25     s1 = kysy("Anna 1. merkkijono >");
          26     s2 = kysy("Anna 2. merkkijono >");
          27     s3 = kysy("Anna 3. merkkijono >");
          28
          29     if ( s1.compareTo(s2) > 0 ) {
          30       t = s1; s1 = s2; s2 = t;
          31     }
          32     if ( s1.compareTo(s3) > 0 ) {
          33       t = s1; s1 = s3; s3 = t;
          34     }
          35     if ( s2.compareTo(s3) > 0 ) {
          36       t = s2; s2 = s3; s3 = t;
          37     }
          38     System.out.println("Jonot "+s1+", "+s2+","+s3+".");
          39   }
          40 }
    
  5. Kolmannen luvun lukeminen voidaan kopioida vaikkapa 2. luvun lukemisesta (rivinumerot viittaavat valmiiseen koodiin):
    1. Siirry rivin 26 alkuun. (nuolet ja [Home])
    2. Merkitse lohkon alku. (paina [Shift] pohjaan ja pidä se siellä)
    3. Siirry seuraavan rivin alkuun. (nuoli alas)
    4. Merkitse lohkon loppu. (päästä [Shift] ylös)
    5. Kopioi lohko leikepöydälle. ([Ctrl-Ins] tai [Ctrl-C])
    6. Liitä lohko leikepöydältä. ([Shift-Ins] tai [Ctrl-V], mahd. uudestaan jos rivi ei tullut kahdesti)
    7. Tee riville tarvittavat muutokset.
  6. Vertailut saadaan vastaavasti kopioimalla rivit 29-31 (ed. esim. mukaiset valmiit rivinrot) kahteen kertaan:
    1. Siirry rivin 29 alkuun. (nuolet ja [Home])
    2. Merkitse lohkon alku. ([Shift] pohjaan ja pidä siellä)
    3. Siirry rivin 32 alkuun. ([nuolet alas])
    4. Merkitse lohkon loppu. ([Shift] ylös)
    5. Kopioi lohko leikepöydälle. ([Ctrl-Ins] tai [Ctrl-C])
    6. Liitä lohko leikepöydältä. ([Shift-Ins] tai [Ctrl-V], mahd. uudestaan)
    7. Tee riveille tarvittavat muutokset.
  7. Tee loput tarvittavat muutokset.
  8. Tallenna ohjelma.
  9. Tarkista ajettava tiedosto ja debuggerin tila.
    • NB: NetBeansilla? voi olla useampia debug-istuntoja päällä samanaikaisesti. Muista lopettaa Jarj2-ohjelman debuggaus, ennenkuin alat debugata Jarj3-ohjelmaa (muuten debuggeri saattaa käynnistää väärän ohjelman). Debuggausistunnon voi lopettaa pikanäppäimellä [Shift-F5].
    • Eclipse: Eclipselläkin voi olla useampia debug-istuntoja päällä samanaikaisesti. Muista lopettaa Jarj2-ohjelman debuggaus, ennenkuin alat debugata Jarj3-ohjelmaa (muuten debuggeri saattaa käynnistää väärän ohjelman). Debuggausistunnon voi lopettaa painamalla punaista neliötä.
  1. Aja ohjelmaa ja tutki toimiiko. Muista, että debuggeria käyttäessä ohjelma pitää käynnistää Run in debugger-komennolla. (NB: [ALT-F5])
  2. Lisää myös s3 WATCH-ikkunaan. Lohkon voi merkitä myös hiirellä. Kokeile sitäkin, mutta muista, että näppäimistö on aina nopeampi ja tarkempi (kun sen kunnolla opettelee)!
  3. Kirjoittamasi koodin voi sisentää automaattisesti valitsemalla halutun alueen ja komennoilla
    • NB: Ctrl-Shift-F tai hiiren oikean napin ponnahdusvalikosta Reformat Code.
    • Eclipse:ssä [CTRL-SHIFT-F].

5. Luokkametodit (funktiot, aliohjelmat...)

Muokataan edellisessä luvussa kirjoitettua ohjelmaa niin, että merkkijonojen vaihto tehdään omassa aliohjelmassaan (koska Java on oliokieli, aliohjelman tai funktion sijaan virallinen nimitys olisi luokkametodi tai staattinen metodi).

  1. Muokkaa tiedostosta Jarj3.java uusi tiedosto Jarj3a.java: Jarj3a.java
  2. Laita WATCH-ikkunaan muuttujat s1, s2, s3, a, b ja t.
  3. Kokeile ajaa askel kerrallaan käyttäen sekä [F5] että [F6] (tai voi olla [F7] ja [F8]). Mikä on näppäinten välinen ero?
  4. Kommentoi metodista vaihda kaikki rivit, joilla kutsutaan append- tai delete-metodeita. Lisää niiden tilalle seuraavat rivit:

a = b; b = new StringBuffer?(t);

  1. Tallenna muutettu ohjelma.
  2. Kokeile ohjelman toimintaa askel kerrallaan. Muuttuvatko s1, s2 ja s3 aliohjelman suorituksen aikana kuten edellisellä kerralla?
  3. Poista tai kommentoi viimeksi kirjoittamasi rivit ja palauta alkuperäiset rivit koodiin.
  4. Käännä Jarj3a.java uudelleen ja kokeile vielä kerran suoritusta askel kerrallaan. Mieti, miksi versiot käyttäytyvät eri tavalla.

Lisätietoa Javan metodeista ja parametrinvälityksestä on luentomonisteessa: luku 8.6.5.

6. Taulukot

Miten edellistä ohjelmaa pitäisi muuttaa mikäli haluttaisiin järjestää 4 lukua? Taitaisi jo tulla varsin sotkuiseksi.

  1. Muutetaan ohjelmaa (kirjoita nimelle Jarj3ta.java, käyttäen pohjana Jarj3.java-ohjelmaa) siten, että apuna käytetään taulukkoa: Jarj3ta.java
  2. Aliohjelma vaihda voidaan hakea tiedostosta Jarj3a.java seuraavasti:
    1. Siirry tiedostoon Jarja3a.java.
    2. Merkitse aliohjelma lohkoksi (siirry alkuun ja [Shift] pohjaan, siirry nuolilla loppuun ja [Shift] ylös).
    3. Kopioi lohko leikekirjaan ([Ctrl-Ins] tai [Ctrl-C]).
    4. Siirry tiedostoon Jarj3ta.java.
    5. Liitä lohko leikekirjasta (siirry haluttuun kohtaan ja paina [Shift-Ins] tai [Ctrl-V]).
  3. Edellinen ohjelma ei ehkä ole yhtä selkeä (?) kuin Jarj3.java, mutta lukujen lukumäärä esiintyy ohjelmassa enää vain yhdessä paikassa. Missä?
  4. Tallenna ohjelma.
  5. Poista WATCH-ikkunasta kaikki tarpeeton:
    1. Siirry WATCH-ikkunaan.
    2. Siirry poistettavalle riville.
    3. Poista rivi. ([DEL])
    4. ...
    5. Siirry takaisin editointi-ikkunaan.
  6. Lisää taulukko luvut sekä muuttujat pienin ja tutki WATCH-ikkunaan.
  7. Aja ohjelmaa askel kerrallaan. Toimiiko täsmälleen vastaavasti kuin Jarj3.java?
  8. Muuta ohjelmassa KOKO-muuttujan arvoksi 5 ja kokeile toimintaa.

7. Järjestäminen ja Java-kielen kirjasto

Järjestämisessä voimme Java-kielen tapauksessa käyttää apuna myös valmista Arrays-luokan metodia sort. Rutiinin käyttämistä varten meidän tarvitsee vain kirjoittaa IComparable-rajapinnan toteuttava luokka, joka osaa verrata järjestettävän taulukon kahta alkiota keskenään palauttaen negatiivisen luvun, nollan tai positiivisen luvun sen mukaan, miten verratattavat alkiot suhtautuvat toisiinsa:

  1. Muuta edellinen ohjelma seuraavanlaiseksi ja tallenna nimellä Jarjta.java: Jarjta.java
  2. Aja ohjelmaa askel kerrallaan. Toimiiko?
  3. Laita keskeytyskohta riville

return s1.compareTo(s2);

  1. sekä lisää muuttujat s1 ja s2 WATCH-ikkunaan. Aja ohjelmaa Run in Debugger-käskyllä. Montako kertaa aliohjelmassa käydään?
  2. Kirjoita vielä edellisestä korjaillen seuraava ohjelma nimelle Jarjnum.java:
  3. Ohjelma joka järjestää merkkijonojen sijasta kokonaislukuja, mutta käyttää samaa sort-metodia. Lukujen järjestämistä varten ei tarvita compare-funktiota.
  4. Aja ohjelmaa rivi kerrallaan. Kokeile luvut-taulukon arvojen muuttamista ajon aikana.
    • NB: Valitse vasemmassa reunassa olevasta Debug-ikkunasta Local Variables. Avaa luvut-muuttuja. Paina hiiren nappia jonkin indeksin kohdalla Value-sarakkeessa. Kirjoita uusi arvo.
    • Eclipse: tuplaklikkaa debug moodissa oikealla ylhäällä olevasta variables listasta luvut-muuttujaa ja näin voit muuttaa sen arvoa.
  5. Aja ohjelma ja ota aika kauanko ohjelman suoritukseen menee.

8. Tavoite

Edellisistä ohjelmista Jarj3a.java näytti ehkä kaikkein selkeimmältä. Siinä oli kuitenkin se vika, että muuttaminen useamman luvun käsittelyä varten vaatisi suuria muutoksia itse ohjelmaan.

Jarj3ta.java voidaan helposti muuttaa käsittelemään useampaakin lukua. Se ei kuitenkaan ole sellaisenaan erityisen selkeä.

Jatkossa pyritään siihen, että em. ohjelma voitaisiin kirjoittaa muodossa:

    ...
    { /* Pääohjelma */
      Luvut luvut = new Luvut();
      luvut.lue(System.in);
      luvut.jarjesta();
      luvut.tulosta(System.out)
      // tai System.out.println(luvut);
    }

Pääohjelman ja "ylemmän tason" aliohjelmien pitäisi siis olla mahdollisimman selkeitä. Tämä parantaa ohjelman luettavuutta ja ylläpidettävyyttä.