Ohjelmoinnin peruskurssien laaja oppimäärä
|
|
- Olavi Virtanen
- 7 vuotta sitten
- Katselukertoja:
Transkriptio
1 Ohjelmoinnin peruskurssien laaja oppimäärä Luento 12: Moniperintä ja rajapinnat, poikkeukset, kontinuaatioista Riku Saikkonen (merkityt ei-laajan kurssin kalvot: Otto Seppälä ja Juha Sorva)
2 Sisältö 1 Moniperintä ja rajapinnat 2 Poikkeukset 3 Kontinuaatioista
3 Moniperinnästä edellä luokilla on ollut vain yksi (suora) yliluokka voisiko yliluokkia olla useampi? muutamassa oliokielessä voi (esim. Common Lisp ja C++) useimmissa vain rajoituksin moniperintä sallisi joskus parempia abstraktioita kuten tavallisellakin perinnällä, sillä voi vähentää koodin kopiointia samoin ongelman mallinnus olioiksi ja luokiksi olisi joskus luonnollisempaa moniperinnän avulla, sillä luonnollinen malli ei aina ole puu mutta käytännössä kokonainen moniperinnän tuki monimutkaistaisi monia oliojärjestelmiä liikaa
4 Moniperinnän ongelmia ohjelmointikielissä moniperinnän perusongelma: jos useammassa perintäverkon haarassa on korvattu sama metodi, mitä niistä käytetään? eri moniperintää tukevilla kielillä on hieman erilainen ratkaisu, mutta yleensä ne perustuvat siihen, missä järjestyksessä yliluokkien nimet kerrotaan aliluokassa mutta toiminta ei ole aina kovin intuitiivista tai helppoa ymmärtää... kentissä on samankaltainen ongelma: jos jokin yliluokka x peritään kahta polkua pitkin, pitäisikö perivään luokkaan tulla yksi vai kaksi kappaletta yliluokan x kenttiä? näkevätkö D-oliossa alla B:n ja C:n metodit eri vai saman x:n? class A { int x; } class B extends A {... } class C extends A {... } class D extends B and C {... } molempia tapoja on käytössä eri kielissä
5 Ohjelmointikielten tekemiä ratkaisuja usein ohjelmointikieli ratkaisee em. ongelmat rajoittamalla moniperintää esim. kielletään periminen niin, että useammassa haarassa olisi korvattu samoja metodeita tai ohjelmoijan pitää erikseen kertoa, minkä yliluokan metodi aliluokan oliosta näkyy Javan ratkaisu: vain rajapintojen moniperintä on mahdollista, varsinaisia suoria yliluokkia on aina yksi rajapinnassa ei ole kenttiä eikä metodien toteutuksia, joten em. ongelmia ei esiinny Scalassa on lisäksi luokan kaltainen rakenne nimeltä trait, jolla voi tehdä eräänlaista moniperintää (lisää myöhemmin)
6 Rajapinnat Rajapinta, interface, on Javan tarjoama mekanismi, jolla voidaan määritellä tyyppi määrittelemättä sille lainkaan toteutusta Abstraktia luokkaa muistuttava rakenne, joka ei kuitenkaan saa sisältää lainkaan metoditoteutuksia tai muuttujia (paitsi vakioita) Metodien esittelyihin ei kuitenkaan tarvita tässä abstract-sanaa, sillä rajapinnan metodit ovat aina abstrakteja ja julkisia Rajapinta näyttää muuten luokkamäärittelyltä, mutta sanan class sijaan tulee merkintä interface public interface Liikkuva { } public void siirry ( Paikka p ); 10:08
7 Perintä vs. Rajapinnat Milloin käyttää perintää ja milloin rajapintoja? Perintää käytetään kun luokat jakavat yhteistä koodia, yhteisiä muuttujia. Yhteinen toiminnallisuus voidaan usein sijoittaa abstraktiin yliluokkaan. Javassa luokka voi periä vain yhden luokan. Päätös käyttää perintää voi olla (* joskus este jatkokehityksessä ratkaisu on usein toiminnan delegointi Rajapintoja käytetään kun luokilla on osittain yhteinen ulkoinen rajapinta, mutta yleensä selkeästi eroavat toteutukset yhteisille ominaisuuksille. Rajapintojen nimet ovat usein ominaisuuksia kuten Comparable, Serializable, Hashable, HasColor, CanBeSaved jne. *) Delegaatiossa osa luokan toiminnoista on siirretty johonkin toiseen, erilliseen, luokkaan. Näin eri yliluokat omaavat aliluokat voivat käyttää yhteistä toiminnallisuutta yhä hyväkseen vaikka koodia ei duplikoida. 10:08
8 Rajapinnat Rajapinnalla määritetty tyyppi on yleensä jonkinlainen ominaisuus, jonka rajapinnan täyttävät luokat omaavat Jokainen ominaisuuden täyttävä luokka kertoo toteuttavansa (implements) rajapinnassa vaaditut metoditoteutukset Jos luokka sekä täyttää rajapinnan että perii luokan merkitään perintä ensin. public class Kontti implements Liikkuva { public void siirry ( Paikka p ){...toteutus public class Kirje implements Liikkuva { public void siirry ( Paikka p ){... Kirjeille sopiva toteutus 10:08
9 Rajapinnat Rajapinta Vain abstrakteja, julkisia metodeja (ei tarvitse erikseen kertoa) Vakioita = (public final static kenttiä) jotka pitää kaikki alustaa Koko rajapinnan näkyvyys on public tai default (ei mitään) Luokka voi täyttää samanaikaisesti monta eri rajapintaa Rajapinnat luetellaan pilkuilla eroteltuna listana implements-määreen jälkeen Moniperinnän kaltaista ongelmatilannetta ei synny...paitsi jos rajapinnoissa voi olla samannimiset metodit jotka on tarkoitettu aivan eri tehtäviin...tai jos muuten samanlaiset metodit omaavat erityyppiset paluuarvot 10:08
10 Rajapinnat Abstrakti luokka voi täyttää rajapinnan vaikka jotkin tai kaikki rajapinnan vaatimat metodit olisivat abstrakteja. Tämä siksi, että luokka joka lopulta toteuttaa abstrakteiksi jääneet metodit kuitenkin täyttää rajapinnan ei voi syntyä olioita, joilla ei olisi toteutuksia näille metodeille. Rajapinta voi periä yhden tai useamman rajapinnan koska toteutusristiriitaa ei juurikaan ole public interface RajapintaA extends RajapintaB, RajapintaC... Myöskään tässä moniperinnän kaltaista ongelmatilannetta ei synny...paitsi jos rajapinnoissa voi olla samannimiset metodit jotka on tarkoitettu aivan eri tehtäviin...tai jos muuten samanlaiset metodit omaavat erityyppiset paluuarvot 10:08
11 Rajapinta Comparable Comparable-rajapinnan määrittelemä ominaisuus on nimenmukaisesti verrattavuus Tämä rajapinta määrittelee yhden metodin compareto Olion tulee verrata itseään parametriolioon ja palauttaa kokonaisluvulla tieto siitä, onko parametriolio yhtäsuuri, suurempi vai pienempi Tämä riittää useimmille tietorakenteille ja algoritmeille monenlaiseen järjestyksen ylläpitoon. Algoritmit käsittelevät rajapinnan täyttäviä olioita Comparable-olioina. public interface Comparable <VerrattavaTyyppi> { } public int compareto ( VerrattavaTyyppi o ); 10:08
12 Rajapinta Comparable Suuri määrä Javan luokista täyttää Comparable-rajapinnan String Integer Date Vastaavasti mm. Collections Frameworkista löytyy paljon metodeja ja luokkia jotka osaavat toimia Comparable-olioiden kanssa esim Collections.sort osaa järjestää listoja joiden alkiot täyttävät Comparablerajapinnan Eclipse-esimerkki livenä... 10:08
13 Muita rajapintoja Serializable ns. Marker Interface joka ei määrittele lainkaan metodeja vaan jota käytetään pelkästään tietyn ominaisuuden omaavien luokkien tunnistamiseen Serializable antaa java:lle luvan sarjallistaa olio muistista kuvaukseksi jonka voi tallentaa/siirtää jonnekin ja myöhemmin/muualla taas ladata takaisin muistiin 10:08
14 Rajapinnat ja dynaaminen tyypitys rajapinnat ovat staattiseen tyypitykseen liittyvä käsite ne tarkistetaan käännösaikana metodikutsu suostutaan kääntämään vain jos kutsuttavan olion käännösaikainen tyyppi toteuttaa metodin sisältävän rajapinnan tai metodi on määritelty yliluokissa tämä on ns. nimipohjainen tyyppijärjestelmä (nominal type system): koodissa ilmoitetut luokkien nimet määräävät, mitä metodeja saa kutsua dynaamisesti tyypitetyissä kielissä yleensä metodikutsu sallitaan, jos kutsuttavalla oliolla on (ajon aikana) halutun niminen metodi näin mm. Pythonissa, Rubyssä ja Common Lispissä siis mikä tahansa olio, joka määrittelee oikean nimiset metodit kelpaa, vaikka se olisi perintähierarkiassa aivan muualla kuin ohjelmoija alun perin ajatteli tämä on nimeltään duck typing joustavampaa, mutta vähentää kääntäjän mahdollisuuksia löytää virheitä
15 Taustaa: mitä on staattinen tyypitys? edellä on monta kertaa puhuttu staattisen ja dynaamisen tyypityksen eroista perusero on toki: dynaamisessa tyypityksessä tyypit tarkistetaan ajon aikana staattisessa tyypityksessä tyypit tarkistetaan ennen suoritusta toinen tapa kuvata eroa: staattinen tyypitys on todistus eräästä ohjelman ominaisuudesta, jonka kääntäjä tarkistaa ja voi sen avulla välttää ajon aikaisia tarkistuksia kolmas tapa: staattisessa tyypityksessä muuttujilla on tyyppi dynaamisessa tyypityksessä arvoilla on tyyppi (yksittäinen muuttuja voi osoittaa mihin tahansa arvoon, mutta arvolla on tietty tyyppi)
16 Tyypityksen erikoisuuksia usein staattinen tyypitys on vain osittaista: joitakin tyyppejä joudutaan kuitenkin tarkistamaan ajon aikana varsinkin oliokielissä, sillä olion tyyppi eli luokka on dynaamisesta metodinvalinnasta johtuen osin ajon aikainen käsite monissa kielissä (mm. Java, C, C++) staattiset tyypit kerrotaan koodissa toinen vaihtoehto on tyyppipäättely, jossa kääntäjä päättelee staattiset tyypit tai osan niistä (esim. Haskell, ML, osin Scala) staattisen ja dynaamisen tyypityksen lisäksi on myös mahdollista jättää tyypit tarkistamatta (tyypitön, untyped, kieli) tai määrätä kaikille arvoille sama tyyppi heikko tyypitys (vs. vahva): tyyppejä ei tarkisteta kaikissa tilanteissa (esim. C-kielessä)
17 Sisältö 1 Moniperintä ja rajapinnat 2 Poikkeukset 3 Kontinuaatioista
18 Mihin poikkeuksia käytetään? Usein poikkeustilanteeseen ei voida reagoida mielekkäästi juuri siellä (siinä metodissa), missä poikkeustilanne syntyy. Esim. Mitä Integer.parseInt-metodin pitäisi tehdä, jos sen parametri on kelvoton? Metodin yleishyödyllisyys laskisi ratkaisevasti, jos se itse päättäisi. Metodin palautusarvoa voi joskus käyttää (ja käytetäänkin) erikoistilanteiden kuvaamiseen, mutta sillä on rajoituksensa. Esim. Metodi palauttaa taulukon pienimmän arvon. Mitä tehdään, jos taulukko onkin tyhjä? Poikkeusten käsittely perustuu Javassa siihen, että on mahdollista heittää poikkeus (eli nostaa poikkeus; engl. throw/raise an exception) eli välittää poikkeustilanneilmoitus eteenpäin sellaisen ohjelmakohdan huoleksi, joka määrittelee, miten poikkeustilanteesta selvitään. Ellei metodi voisi heittää poikkeusta, jouduttaisiin erikoistilanteisiin aina joko reagoimaan sen metodin sisällä, jossa ne syntyvät, tai välittämään tieto tilanteesta eteenpäin jollain tarkoitukseen vähemmän luonnollisella tavalla (yleensä metodin palautusarvona). 10:08
19 Poikkeusoliot, Exception-luokka Poikkeustilanteet kuvataan Javassa olioina (yllätys). Kaikki poikkeusoliot ovat luokan java.lang.exception ilmentymiä - joko suorasti tai epäsuorasti. Yleisluontoisia poikkeusolioita on mahdollista instantioida suoraan Exception-luokasta, mutta tavallisesti on mielekkäämpää luoda erikoistuneempi olio jostakin tämän emäluokan aliluokasta. Käytännössä poikkeusolioita luodaan lähes aina juuri silloin, kun halutaan ilmoittaa suoritettavan metodin kutsujalle, että metodin suoritus jostain syystä epäonnistui, eli halutaan heittää poikkeus. Tämä kutsuja(metodi) voi sitten päättää, miten suhtautuu asiaan. Poikkeukset muodostavat kommunikointikanavan kutsutulta metodilta kutsuvalle (vrt. metodin palautusarvo). 10:08
20 Poikkeusten heittäminen Poikkeuksen heittämiseen on Javassa erikseen määritelty throw-käsky. Heittolauseelle annetaan heitettäväksi yksi poikkeusolio. throw-lause keskeyttää metodin normaalin suorituksen. Suoritusta jatketaan ensimmäisestä löydetystä ohjelmakohdasta, johon on kirjattu menettely kyseisenlaisten poikkeusten käsittelyyn. if (hommaeitoiminut) throw new Exception( Juttu X meni pieleen. ); // Näille riveille ei mennä, jos poikkeus // heitettiin. Sen sijaan hypätään sellaiseen // ohjelmakohtaan, johon on merkitty erityisiä // poikkeuksenkäsittelykäskyjä. Tässä luodaan poikkeusolio ja heitetään se saman tien. (Nämä kaksi asiaa tehdäänkin hyvin usein yhdessä.) Ei onnistunut! Sä annoit tän tehtävän, joten tiedät kai sitten mitä tälle tehdään! Siihen miten tällainen poikkeuksenkäsittelijärakenne merkitään Javaohjelmaan, palataan tuossa tuokiossa. Tavallisesti tällaista poikkeuksenkäsittelijärakennetta ei löydy samasta metodista throw-lauseen kanssa. Tällöin poikkeus heitetään ulos metodista, 10:08 eli metodin suoritus keskeytyy kokonaan ja poikkeukselle lähdetään etsimään käsittelijää sitä kutsuneesta metodista.
21 Poikkeusmahdollisuudesta varoittaminen Suuri osa Javan poikkeuksista kuuluu ns. tarkastettavien poikkeusten kategoriaan (engl. checked exceptions). Monien mielestä ohjelmoijan itse määrittelemien poikkeustyyppien tulisi sisältyä tähän joukkoon. Vastakohtana vapaasti heitettävät poikkeukset, joita käsitellään myöhemmin. Jos jokin metodi saattaa heittää ulos tarkastettavan poikkeuksen, on metodin kerrottava kutsujilleen tästä määrittelynsä yhteydessä. Metodi varoittaa mahdollisesti heittävänsä poikkeuksen. Heittämisilmoitus merkitään throws-määrellä (vrt. throw-lause) metodin puumerkin yhteyteen Jos metodin suoritus voi mennä pieleen usealla eri tavalla, voi poikkeustyyppejä luetella useita. Okei, vaan jos jokin mättää, niin se on sun ongelma. public int esimerkkimetodi() throws Poikkeustyyppi1, Poikkeustyyppi2 /* jne. */ { //... } 10:08
22 Poikkeuksiin reagoiminen Jos jokin metodi kutsuu toista metodia, joka on ilmoittanut mahdollisesti heittävänsä (tarkastettavan) poikkeuksen, on kutsuvan metodin koodiin erikseen merkittävä, miten se suhtautuu tähän mahdollisuuteen. Vaihtoehdot ovat: sieppaaminen: reagoin suorittamalla nämä ja nämä koodirivit eteenpäin syöttäminen: reagoin välittämällä homman muiden ohjelman osien huoleksi. No, okei, tää on mun homma. En minäkään tiedä mitä sille tehdään! Hoida sinä siellä! Kääntäjä esittää vastalauseensa, ellei jompaa kumpaa suhtautumistapaa ole koodiin kirjattu. Näin ohjelmoija pakotetaan ottamaan kantaa siihen, miten (tarkastettavat) poikkeustilanteet käsitellään. Vrt. palautusarvojen käyttö erikoistilanteista tiedottamiseen. Huomattava osa käytössä olevien ohjelmien bugeista johtuu siitä, ettei 10:08 erilaisiin erikoistilanteisiin ole varauduttu huolella.
23 Poikkeusten sieppaaminen try { Metodi, joka kutsuu poikkeuksen mahdollisesti heittävää metodia, voi ilmoittaa itse hoitelevansa eli sieppaavansa (engl. catch) syntyvät poikkeukset (tai ainakin tietyntyyppiset poikkeukset). Tämä toteutetaan try-catch-lauseella: yritän tehdä nämä hommat, mutta jos niitä suorittaessa jokin menee pieleen, niin sieppaan poikkeusolion ja katson mitä sillä teen. Koodia, jonka ainakin yhdestä kohdasta kutsutaan poikkeuksen mahdollisesti heittävää metodia. } catch (jonkintyyppinen poikkeus) { Koodia, joka suorittamalla reagoidaan tällaiseen poikkeukseen. } catch (toisentyyppinen poikkeus) { Koodia, joka suorittamalla reagoidaan tähän toiseen poikkeustyyppiin. } (jne.) Jos jostain try-lohkossa kutsutusta metodista heitetään poikkeus, hypätään loppuosa lohkosta ohi ja siirrytään catchlohkoon. Jos try-lohkon suoritus onnistuu mutkitta, ei mitään catch-lohkoa suoriteta. catch-lohkoja voi olla usealle eri poikkeustyypeille. Usein yksikin riittää. Kun jonkin lohkoista loppu saavutetaan, jatkuu ohjelman suoritus tavalliseen tapaan try-catch-lauseen jälkeisiin lauseisiin. 10:08
24 try-catch Esimerkki Yritetään luoda uusi opiskelijaolio ja tulostaa sen opiskelijanumero. Opiskelijaluokan konstruktorista ilmoitetaan, että se voi heittää poikkeuksen. Varautumiseen on syytä. Sijoitetaan lauseet try-lohkoon. Jos konstruktori heittää poikkeuksen, ei tulostuslausetta suoriteta, vaan hypätään catch-osioon. Tämä lohko sieppaa luokan VirheellinenOpiskelijaData olioita (mahdollisten aliluokkien ilmentymät mukaan lukien). Kun lohko aktivoituu ja sieppaa poikkeuksen, sijoittuu heitetty olio automaagisesti paikalliseen muuttujaan (tässä nimeltä dataongelma), jonka käyttöalueena on catch-lohko. Vrt. metodien parametrit. Opiskelija opiskelija; try { opiskelija = new Opiskelija( Teemu Teekkari ); System.out.println( opiskelija.kerroopiskelijanumero() ); } catch ( VirheellinenOpiskelijadata dataongelma ) { } opiskelija = null; System.out.println( dataongelma.getmessage()); System.out.println( Virheellinen datarivi oli \ + dataongelma.kerrovirheellinendata() + \. ); Opiskelijadatassa ei ollut tasan kolmea sanaa. Virheellinen datarivi oli Teemu Teekkari. Kuvausviesti saadaan Exception- luokasta perityllä getmessagemetodilla. 10:08
25 printstacktrace-metodi Luokan Exception metodi printstacktrace tulostaa luettelon, josta käy ilmi, minkä metodien kutsujen seurauksena poikkeustilanne on syntynyt. Tulostuu poikkeusta luotaessa tallennettu kutsupino (engl. call stack). printstacktrace ja getmessage-metodia sekä muita kyseiselle poikkeustyypille määriteltyjä metodeita käyttäen voidaan edesauttaa virheiden etsintää ohjelmasta. Eräs poikkeuksien vahvuuksista on se, että niillä voi kätevästi välittää kuvauksia ja lisätietoja ongelmatilanteista. public void testaile() { try { this.opiskelija = new Opiskelija( Teemu Teekkari ); System.out.println(this.opiskelija.kerroOpiskelijanumero()); } catch (VirheellinenOpiskelijadata dataongelma) { this.opiskelija = null; dataongelma.printstacktrace(); } } tulostaa esim. VirheellinenOpiskelijadata: Opiskelijadatassa ei ollut tasan kolmea sanaa. at Opiskelija.<init> (Opiskelija.java:9) at Kokeiluohjelma.testaile (Kokeiluohjelma.java:29) at Kokeiluohjelma.main (Kokeiluohjelma.java:7) 10:08
26 Poikkeuksen heittäminen eteenpäin Metodi, joka kutsuu poikkeuksen mahdollisesti heittävää metodia, voi sieppaamisen sijaan suhtautua kutsumastaan metodista heitettyihin poikkeuksiin passiivisemminkin ja heittää ne (tai ainakin tietyntyyppiset niistä) eteenpäin sitä itseään kutsuneelle metodille. Tämä edellinen kutsuja voi sitten puolestaan jälleen joko siepata poikkeuksen tai heittää sen yhä aikaisemmalle tasolle kutsujen sarjassa. Eteenpäin heittäminen tehdään yksinkertaisesti merkitsemällä kyseinen poikkeustyyppi (tai -tyypit) tämän toisenkin metodin throws-osioon. Metodi testaile ilmoittaa vain heittävänsä VirheellinenOpiskelijadatapoikkeuksia, eikä itse määrittele niille käsittelytapaa. public void testaile() throws VirheellinenOpiskelijadata { this.opiskelija = new Opiskelija( Teemu Teekkari ); System.out.println(this.opiskelija.kerroOpiskelijanumero()); } Jos opiskelijakonstruktori heittää poikkeuksen, keskeytyy testaile-metodin suoritus konstruktorikutsuun samaan tapaan kuin jos siinä kohdassa olisi throw-lause. Konstruktorin luoma poikkeusolio heitetään ulos myös testaile-metodista. 10:08
27 Poikkeuksen heittäminen ulos ohjelmasta Poikkeuksen heittäminen ulos metodista on ongelmanratkaisun siirtämistä tuonnemmaksi. Jossakin on lopulta ilmoitettava, miten pulmaan reagoidaan tai ohjelman suoritus ei voi jatkua. Poikkeuksen voi periaatteessa heittää aina ohjelman käynnistysmetodiin main saakka. Myös käynnistysmetodin voi määrätä heittämään poikkeuksen, mutta tällöin vastaanottajaksi jää loppujen lopuksi enää main-metodia tulkkiohjelman välityksellä kutsunut ohjelman käyttäjä, jonka syliin ongelma kippautuu. Tämä johtaa normaalisti ohjelman (säikeen) kaatumiseen ja Javavirtuaalikoneen tulostamaan poikkeustilanneilmoitukseen. Erittäin huonoa tyyliä safiiri ~ % java Kokeiluohjelma VirheellinenOpiskelijadata: Opiskelijadatassa ei ollut tasan kolmea sanaa. at Opiskelija.<init> (Opiskelija.java:9) at Kokeiluohjelma.testaile (Kokeiluohjelma.java:29) at Kokeiluohjelma.main (Kokeiluohjelma.java:7) 10:08
28 Vapaasti heitettävät poikkeukset Tietyt Java-kielen peruskäyttöön kytkeytyvät poikkeustapaukset ovat niin yleisiä ja perustavaa laatua olevia, ettei niitä tarvitse eksplisiittisesti huomioida ohjelmakoodissa. Näitä vapaasti heitettäviä poikkeuksia (engl. unchecked exceptions) (vrt. tarkastettavat poikkeukset) ovat mm. NullPointerException: yritetään viitata null-viittauksen läpi. ArrayIndexOutOfBoundsException: viitataan olemattomaan taulukkoalkioon ClassCastException: kelvoton tyyppimuunnos ArithmeticException: esim. jaetaan nollalla NumberFormatException: esim. yritetään tulkita kissa lukuna Exception-luokalla on (java.lang-pakkauksessa) aliluokka RuntimeException. Sen ilmentymät ovat vapaasti heitettäviä. Javan vapaasti heitettäviä poikkeuksia kuvaavat luokat ovat siis luokan RuntimeException aliluokkia. Luokalle voi itsekin luoda aliluokkia, ja kehittää omia vapaasti heitettäviä 10:08 poikkeustyyppejä. Omista poikkeustyypeistä kannattaa kuitenkin yleensä tehdä tarkastettavia.
29 Vapaasti heitettävät poikkeukset Vapaasti heitettäviä poikkeuksia ei siis tarvitse kirjata throwsmerkinnällä, vaikka metodi niitä voisikin heittää. Monet näistä poikkeuksista ovatkin sellaisia, että ne voivat syntyä lähes missä vaan, ja olisi melko tuskaisaa kirjoittaa koodia, jossa jatkuvasti catch-lohkoin varauduttaisiin niihin Tämä ei tarkoita, etteivät vapaasti heitettävät poikkeukset tulisi samalla tavalla heitetyiksi metodilta toiselle kuin muutkin poikkeukset - kunnes ne siepataan tai lentävät ulos käynnistysmetodista. Ohjelman välitön kuolinsyy onkin usein juuri sieltä ulos sinkoutunut vapaasti heitettävä poikkeus. Ohjelmoijalle jää koko vastuu hoitaa nämä poikkeukset jotenkin - estämällä niiden syntyminen tai sieppaamalla ne. Myös vapaasti heitettäviä poikkeuksia voi (ja tilanteesta riippuen saattaa kannattaakin) siepata samaan tapaan kuin tarkastettaviakin poikkeuksia. Niiden heittymisen voi myös kirjata throws-määreellä metodien toiminnan täsmentämiseksi, vaikka se ei olekaan pakollista. 10:08
30 Virheet, Luokka Error Jos ajettaessa tapahtuu virhe, josta ohjelma ei pystyne toipumaan, synnyttää ja heittää ohjelmaa ajava Javavirtuaalikone virheolion. Esim. Yritetään luoda uusi olio, mutta tietokoneen muisti loppuu kesken. Esim. Joku ohjelman luokkatiedostoista on tuhoutunut tai siihen ei pääse käsiksi. Virheen syntyminen johtaa yleensä siihen, että ohjelma kaatuu ja näytölle tulostuu jonkinlainen virheilmoitus. Virheoliot ovat java.lang.errorin (tai sen aliluokan) ilmentymiä ja niitä heitetään samaan tapaan kuin vapaasti heitettäviä poikkeuksia. Virheolioita ei niiden luonteen vuoksi aina ole mielekästä siepata. Ne kertovat sellaisista hyvin vakavista, mahdollisesti laitteistoriippuvaisista ongelmista, joiden korjaaminen ohjelman ajon aikana ei usein ole realistista. 10:08
31 Heiteltävien asioiden hierarkia Throwable Oliot, joita voi heittää ja siepata. Exception Hankaluudet ja epätavalliset tilanteet. Error Lähes varmasti kuolettavat virheet.... Esim. FileNotFoundException sekä itse määriteltyjä poikkeuksia RuntimeException Vapaasti heitettävät poikkeukset... Esim. NullPointerException, ArrayIndexOutOfBoundsException sekä itse määriteltyjä poikkeuksia Esim. OutOfMemoryError... 10:08
32 try-catch-finally Catch-osioiden lisäksi try-lohkon perään voi sijoittaa myös finally-lohkon Finally-lohko suoritetaan try-lohkosta poistuttaessa kun mahdolliset catchlohkot on suoritettu. Finally suoritetaan vaikka try-lohkosta poistuttaisiin vapaasti heitettävällä poikkeuksella tai return-lauseella. ja se suoritetaan vasta returnin jo saatua palautettavan arvon. Tämän vuoksi finally on usein turvallinen paikka suorittaa joitakin siivousoperaatioita sillä mahdolliset ajonaikaisetkaan virheet eivät voi estää rivien suoritusta Kun finally on suoritettu koodin suoritus jatkuu kuten se olisi jatkunut ilman finally-lohkoa Esimerkki finally:n käytöstä tulee tietovirtojen yhteydessä maanantaina. 10:08
33 Poikkeusten ketjuttaminen Joskus heitettävä virhe johtuu toisesta poikkeuksesta ja tieto alkuperäisestä poikkeuksesta halutaan myös säilyttää, voidaan alkuperäinen poikkeus ketjuttaa uuden perään Käytännössä luodaan uusi poikkeusolio ja metodilla initcause kerrotaan tälle alkuperäisestä poikkeuksesta ennen kuin uusi poikkeus heitetään. 10:08
34 Poikkeukset kontrollirakenteena poikkeuksilla voisi periaatteessa toteuttaa muutaman muun kontrollirakenteen: break ja continue silmukasta (tee catch silmukan ehtoon) return funktiosta tai metodista (lisää funktion rungon ympärille trycatch) käytännössä koodin selkeyden ja tehokkuuden vuoksi ei kannata yleinen käytäntö: poikkeus kuvaa poikkeuksellista tilannetta tai virhettä, ei tavanomaista suorituksen etenemistä mutta joskus poikkeuksia käytetään myös muuten esimerkiksi monimutkaisesta rekursiosta voi hypätä pois heittämällä poikkeuksen
35 Poikkeusten toteuttaminen miten poikkeukset oikeasti toimivat? poikkeus hyppää aina ylöspäin kutsupinossa tai ulommas funktion sisällä ei toisen rakenteen sisään (paitsi catch-lohkoon) eikä paikkaan, jonka sisällä ei nyt olla toteutus voisi olla: pidetään kirjaa kutsupinosta ja koodin sisäkkäisistä rakenteista poikkeuksen heittäminen purkaa osan näistä (samaan tapaan kuin myöhemmin tehtäisiin, jos poikkeusta ei olisi tullut) ja asettaa ohjelman tilaan tiedon poikkeuksesta trycatch-rakenne tarkistaa koodinsa suorittamisen jälkeen, onko joku asettanut tiedon poikkeuksesta (jos ei, siirtyy eteenpäin catch-lohkojen yli)
36 Sisältö 1 Moniperintä ja rajapinnat 2 Poikkeukset 3 Kontinuaatioista
37 Mikä on kontinuaatio? kontinuaatio (continuation) eli jatko sisältää laskennan tilan, tarkemmin sanoen: kutsupinon ja ympäristön (muuttujien arvot) paikan koodissa eli lausekkeen, jota parhaillaan evaluoidaan myös esim. tiedon jo evaluoiduista alilausekkeista kontinuaatio kertoo, mitä tämän kohdan jälkeen tehdään esimerkki: eräs kontinuaatio Scheme-lausekkeesta (let ((a 1)) (- (+ a a) (* a 2))) on kohdassa, jossa alilausekkeet - ja (+ a a) on jo evaluoitu ja lauseketta (* a 2) ollaan juuri evaluoimassa kontinuaatiota voi ajatella poikkeusten yleistyksenä: heitetty poikkeus unohtaa throw-kohdan kontinuaation ja hyppää erääseen trycatch-lauseen kontinuaatioon (catchin alkuun) kontinuaatioilla voi hyppiä muullakin tavalla ja monta kertaa samaan kohtaan käsite on varsin monimutkainen, joten ei tarvitse huolestua, jos ei ymmärrä kaikkea...
38 Eksplisiittiset kontinuaatiot Schemessä Schemessä laskennan nykyisen kontinuaation voi ottaa ohjelmassa talteen ja siihen voi myöhemmin hypätä takaisin jopa useita kertoja (palataan joka kerta samaan kohtaan) sama lauseke voi siis palata monta kertaa esim. eri paluuarvoilla kontinuaation talletusmuoto on proseduuri, jota kutsumalla kontinuaatioon hypätään kontinuaation kutsuminen ei enää palaa sinne, mistä kutsu tehtiin (samoin kuin throw) kutsussa annetaan argumentti, josta tulee kontinuaation alun perin luoneen lausekkeen arvo (sitä oltiin evaluoimassa kun kontinuaatio luotiin) samanlainen ominaisuus löytyy muutamasta muustakin kielestä (mm. Ruby), mutta kovin yleinen se ei ole
39 Schemen call-with-current-continuation Scheme-primitiivi call-with-current-continuation (lyh. call/cc) kutsuu argumenttinaan saamaansa proseduuria antaen kontinuaation sille argumentiksi käyttö yleensä: (call/cc (lambda (k)...)) tämän call/cc-lausekkeen arvo on normaalisti...-lausekkeen arvo mutta jos k:ta kutsuu, koko call/cc-lausekkeen arvoksi tulee k:lle annettu argumentti, ja evaluointi etenee niin kuin call/cc-lauseke olisi juuri palannut k:ta voi kutsua joko lausekkeen sisältä (vrt. break tai poikkeukset) tai myöhemmin
40 Scheme-esimerkki Kontinuaatioesimerkki (define (copy-list-if-positive l) (call/cc (lambda (k) (define (loop l) (cond ((null? l) '()) ((<= (car l) 0) (k '())) (else (cons (car l) (loop (cdr l)))))) (loop l)))) (copy-list-if-positive '( )) ( ) (copy-list-if-positive '( )) ()
41 Mihin kontinuaatioita käytetään? eksplisiittisillä kontinuaatioilla voi (ainakin periaatteessa) toteuttaa monia kontrollirakenteita, esimerkiksi: poikkeukset sekä break silmukasta ja return funktiosta generaattorit ja epädeterministinen laskenta (useita vaihtoehtoisia paluuarvoja, joita kokeillaan yksi kerrallaan) voi tallettaa laskennan tilan ja jatkaa siitä myöhemmin tätä käytetään joissain WWW-sovelluskehyksissä kun sovellus jää odottamaan käyttäjältä vastausta esim. lomakkeeseen, sen tila talletetaan kontinuaatioon jos/kun vastaus tulee, kontinuaatiota kutsutaan käyttäjältä saadulla syötteellä sovelluksen ohjelmoijalle tämä näyttää tavalliselta odottavalta (blocking, synchronous) I/O:lta sovellus voi palata tilassaan taaksepäin (esim. selaimen Back-napin tukemiseksi) vanhan kontinuaation kutsulla
42 Continuation-passing style ohjelmointityyli, jolla kontinuaatiot saa käyttöön, vaikka ohjelmointikieli ei tukisi eksplisiittisiä kontinuaatioita tarvitsee kuitenkin ensimmäisen luokan funktiot (käytännössä myös häntärekursio-optimoinnin) myös käännöstekniikka: jotkut funktionaalisten kielten kääntäjät muuttavat koodin CPS-muotoon eräs tapa toteuttaa eksplisiittiset kontinuaatiot ja poikkeukset CPS:ssä kaikilla proseduureilla on ylimääräinen kontinuaatioargumentti (yleensä k) proseduurit palaavat aina kutsumalla k:ta paluuarvollaan (eivät siis koskaan palauta arvoa normaalisti) tämä kutsu on aina häntärekursiivinen k vastaa call/cc:n tuottamaa kontinuaatiota sovelluksesta riippuu, kuinka pitkälle CPS-muoto viedään SICP-kirjan luvun 4.3 tulkki on kirjoitettu (noin) CPS-tyyliin
43 CPS-esimerkki Tavallinen kertoma (define (fact n) (if (= n 0) 1 (* n (fact (- n 1))))) Eräs CPS-kertoma (define (=k a b k) (k (= a b))) (define (-k a b k) (k (- a b))) (define (*k a b k) (k (* a b))) ; ''primitiivi'', ei CPS-muodossa ; ''primitiivi'', ei CPS-muodossa ; ''primitiivi'', ei CPS-muodossa (define (fact n k) (=k n 0 (lambda (pred) (if pred (k 1) (-k n 1 (lambda (arg) (fact arg (lambda (res) (*k n res k))))))))) (fact 10 display) 10
815338A Ohjelmointikielten periaatteet
815338A Ohjelmointikielten periaatteet 2015-2016 VIII Poikkeusten ja tapahtumien käsittely Sisältö 1. Poikkeusten käsittelyn käsitteitä ja suunnittelukriteerejä 2. Poikkeusten käsittely C++:ssa 3. Poikkeusten
Lisätiedot14. Poikkeukset 14.1
14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.
LisätiedotSisällys. 14. Poikkeukset. Johdanto. Johdanto
Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla
LisätiedotScheme-kesäkurssi luento 3
Scheme-kesäkurssi luento 3 Riku Saikkonen 6. 7. 2009 Sisältö 1 Nelilaskin 2 Muuttujat 3 Ympäristöt 4 Scheme-tulkki 5 Kontinuaatiot 6 CPS Miksi SICP-kirjassa on Scheme-tulkkeja? tulkin näkeminen auttaa
Lisätiedot14. Poikkeukset 14.1
14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla
LisätiedotSisällys. 14. Poikkeukset. Johdanto. Johdanto
Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.
LisätiedotPoikkeustenkäsittely
1 Poikkeustenkäsittely Mitä poikkeustenkäsittely tarkoittaa? Poikkeuksen käsitteleminen Poikkeusluokkien hierarkia Poikkeuksen heittäminen 1 Mitä poikkeustenkäsittely tarkoittaa? Poikkeus (Exception) on
LisätiedotOlio-ohjelmointi Virhetilanteiden käsittely
Olio-ohjelmointi 2016 Virhetilanteiden käsittely Poikkeustilanteet n Java-järjestelmässä voidaan ottaa kiinni ohjelman suoritusaikana tapahtuvia virhetilanteita, joita ei saada kiinni tavanomaisilla ohjausrakenteilla
LisätiedotOpintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Poikkeukset Poikkeuksella tarkoitetaan yllättävää ajonaikaista tilannetta, joka
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 3: Poikkeukset, tiedostot ja tietovirrat Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 8. 2. 2012 Sisältö 1 Poikkeukset 2 Poikkeusten
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Tulkin muokkaaminen, sisäiset määrittelyt, makrot (mm. SICP 3.2.4, 4-4.1.6) Riku Saikkonen 29. 11. 2012 Sisältö 1 Kirjan tulkin muokkaaminen 2 Yksityiskohta:
LisätiedotOpintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Olioiden toteuttaminen Riku Saikkonen 28. 11. 2011 Sisältö 1 Miten oliot ja metodikutsut toimivat? 2 Oliot Minkä luokan metodia kutsutaan? Python-esimerkki
LisätiedotMitä poikkeuskäsittely tarkoittaa?
Poikkeuskäsittely Mitä poikkeuskäsittely tarkoittaa? Poikkeuskäsittelyluokkien hierakkia Poikkeuksen sieppaaminen Mihin järjestykseen try-catch-lauseen ExceptionType-poikkeukset laitetaan? Poikkeuksen
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Keskeneräinen luento 3: Listat (mm. SICP 22.2.3) Riku Saikkonen 31. 10. 2011 Sisältö 1 Linkitetyt listat 2 Linkitetyt listat (SICP 2.1.1, 2.2.1) funktionaalinen
LisätiedotJava kahdessa tunnissa. Jyry Suvilehto
Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 10: Tulkin muokkaus, makrot, ohjelmia muokkaavat ohjelmat (mm. SICP 3.2.4, 4-4.1.6) Riku Saikkonen 22. 11. 2011 Sisältö 1 Kirjan tulkin muokkaaminen 2
LisätiedotLuento 2. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä
Luento 2 T-106.1240 Ohjelmoinnin jatkokurssi T1 & T-106.1243 Ohjelmoinnin jatkokurssi L1 Luennoitsija: Otto Seppälä Kurssin WWW: http://www.cs.hut.fi/opinnot/t-106.1240/s2007 Abstrakti luokka Abstrakti
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: SICP kohdat 22.2.3 Riku Saikkonen 2. 11. 2010 Sisältö 1 Linkitetyt listat 2 Listaoperaatioita 3 Listarakenteet 4 Gambit-C:n Scheme-debuggeri Linkitetyt
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 3: Poikkeukset, tiedostot ja tietovirrat Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 28. 1. 2013 Sisältö 1 Poikkeukset 2 Poikkeusten
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 8: Pienen ohjelmointikielen tulkki (ohjelmoitava laskin) (mm. SICP 4-4.1.5 osin) Riku Saikkonen 15. 11. 2012 Sisältö 1 Nelilaskintulkki, globaalit muuttujat
LisätiedotSisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki
Sisällys JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta Abstrakti luokka ja metodi Rajapintamäärittely (interface) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E.
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
Lisätiedot815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset
815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
Lisätiedot812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä
812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Olioiden toteuttaminen, abstraktit luokat yms. Riku Saikkonen (merkityt ei-laajan kurssin kalvot: Otto Seppälä) 27. 1. 2011 Sisältö 1 Kertausta Scheme-tulkista
LisätiedotOhjelmoinnin jatkokurssi, kurssikoe 28.4.2014
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.
LisätiedotJava-API, rajapinnat, poikkeukset, UML,...
Java-API, rajapinnat, r poikkeukset, UML,... Janne Käki 12.10.2006 Keskeisimmät Java-API:n pakkaukset API = Application Programming Interface eli sovellusohjelmointirajapinta (!) pakkaus (engl. package)
LisätiedotMetodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen
Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 10: Paikalliset muuttujat, kirjan tulkki kokonaisuutena (mm. SICP 3.2, 4.1.24.1.6) Riku Saikkonen 22. 11. 2012 Sisältö 1 Ympäristöt: miten paikalliset
LisätiedotOhjelmoinnin perusteet, syksy 2006
Ohjelmoinnin perusteet, syksy 2006 Esimerkkivastaukset 1. harjoituksiin. Alkuperäiset esimerkkivastaukset laati Jari Suominen. Vastauksia muokkasi Jukka Stenlund. 1. Esitä seuraavan algoritmin tila jokaisen
LisätiedotRajapinta (interface)
1 Rajapinta (interface) Mikä rajapinta on? Rajapinta ja siitä toteutettu luokka Monimuotoisuus ja dynaaminen sidonta Rajapinta vs periytyminen 1 Mikä rajapinta on? Rajapintoja käytetään, kun halutaan määritellä
LisätiedotSisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista
Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
LisätiedotSisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2
4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä
LisätiedotSisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2
4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely
Lisätiedot5/20: Algoritmirakenteita III
Ohjelmointi 1 / syksy 2007 5/20: Algoritmirakenteita III Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/17 Tämän
Lisätiedot11/20: Konepelti auki
Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon
Lisätiedot1. Omat operaatiot 1.1
1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 4: Symbolit, derivojaesimerkki, kierroksen 1 ratkaisut (mm. SICP 2.32.3.2) Riku Saikkonen 1. 11. 2011 Sisältö 1 Symbolit ja sulkulausekkeet 2 Lisää Schemestä:
LisätiedotOlio-ohjelmointi Javalla
1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi
Lisätiedot815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, todistamisesta (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 7. 11. 2011 Sisältö 1 Muuttujan arvon muuttaminen: set! 2 SICP-oliot
LisätiedotSisältö. 22. Taulukot. Yleistä. Yleistä
Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä
Lisätiedot812341A Olio-ohjelmointi Peruskäsitteet jatkoa
812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää
LisätiedotOlion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();
Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio
Lisätiedot9. Periytyminen Javassa 9.1
9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.
LisätiedotGroovy. Niko Jäntti Jesper Haapalinna Group 31
Groovy Niko Jäntti Jesper Haapalinna Group 31 Johdanto Groovy on Apachen kehittämä Javaan perustuva dynaaminen oliopohjainen ohjelmointikieli. Kielen kehitys alkoi vuonna 2003, versio 1.0 julkaistiin 2007
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 9: Makrot ja dynaaminen sidonta Riku Saikkonen 7. 12. 2010 Sisältö 1 Makrot 2 Pieni esimerkki abstraktion tekemisestä 3 Dynaaminen sidonta Mikä on makro?
LisätiedotJavan perusteita. Janne Käki
Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).
Lisätiedot58131 Tietorakenteet ja algoritmit (syksy 2015)
58131 Tietorakenteet ja algoritmit (syksy 2015) Harjoitus 2 (14. 18.9.2015) Huom. Sinun on tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. 1. Erään algoritmin suoritus vie 1 ms, kun syötteen
Lisätiedot- Komposiittityypit - Object (Mukaanlukien funktiot) - Array. - Erikoisdatatyypit - null - undefined
Ohjelmointitekniikka Tyyppiturvallisuuden tavoittelua Javascriptissa muuttujat ovat tyypittömiä, mutta arvoilla on tyyppi. Muuttuja esitellään var -avainsanalla ja muuttujan tyypin arvoa ei erikseen määritellä.
Lisätiedot12. Monimuotoisuus 12.1
12. Monimuotoisuus 12.1 Sisällys Johdanto. Periytymismekanismi määrittää alityypityksen. Viitteiden sijoitus ja vertailu. Staattinen ja dynaaminen luokka. Myöhäinen ja aikainen sidonta. Parametrinvälitys
Lisätiedot15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien
Lisätiedot7. Oliot ja viitteet 7.1
7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin
LisätiedotSisältö. 2. Taulukot. Yleistä. Yleistä
Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä
LisätiedotITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat
LisätiedotAalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa
Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1 Oliot ja luokat Javaohjelmoinnissa Vesa Laakso 22.9.2012 Sisällysluettelo Sisällysluettelo... 1 Johdanto... 2 1. Luokka... 2 2. Olio... 2 3. Luokan
LisätiedotSisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä
Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.
LisätiedotITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat
LisätiedotJava-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä, kevät
Ohjelmoinnin peruskurssien laaja oppimäärä, kevät Luento 2: Ohjelman suunnittelua, miten oliot toimivat Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 21. 1. 2013 Sisältö 1 Suunnittelua:
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 1: Rekursiivinen ajattelutapa, Scheme-kielen perusteita (mm. SICP 11.2.4) Riku Saikkonen 16. 10. 2012 Sisältö 1 Kurssijärjestelyitä 2 Perusteita Scheme-kielestä,
LisätiedotELM GROUP 04. Teemu Laakso Henrik Talarmo
ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................
Lisätiedot15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:
LisätiedotTutoriaaliläsnäoloista
Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus
LisätiedotYleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.
2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 1: SICP luku 1 Riku Saikkonen 1. 11. 2010 Sisältö 1 Kurssijärjestelyitä 2 SICP-kirjasta 3 Häntärekursio 4 Rekursio 5 Funktiot argumentteina 6 Funktiot
LisätiedotA) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)
1(37) PERIYTYMINEN (inheritance) YLILUOKKA (superclass) ALILUOKKA (subclass) A) on käytännöllinen ohjelmointitekniikka = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys) B) on käsitteiden
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: Funktioiden käyttöä, lisää Schemestä (mm. SICP 1.31.3.4) Riku Saikkonen 17. 10. 2011 Sisältö 1 Scheme-ohjelmointikäytäntöjä 2 Funktiot argumentteina
LisätiedotTietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla
Tietojen syöttäminen ohjelmalle Tähän mennessä on käsitelty Javan tulostuslauseet System.out.print ja System.out.println sekä ohjelman perusrakenneosat (muuttujat, vakiot, lauseet). Jotta päästään tekemään
LisätiedotTietorakenteet (syksy 2013)
Tietorakenteet (syksy 2013) Harjoitus 1 (6.9.2013) Huom. Sinun on osallistuttava perjantain laskuharjoitustilaisuuteen ja tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. Näiden laskuharjoitusten
LisätiedotTietorakenteet ja algoritmit syksy Laskuharjoitus 1
Tietorakenteet ja algoritmit syksy 2012 Laskuharjoitus 1 1. Tietojenkäsittelijä voi ajatella logaritmia usein seuraavasti: a-kantainen logaritmi log a n kertoo, kuinka monta kertaa luku n pitää jakaa a:lla,
LisätiedotOperaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta
C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 8: Tulkki: proseduurit, abstrakti syntaksi, quote ja cond (mm. SICP 44.1.5 osin) Riku Saikkonen 15. 11. 2011 Sisältö 1 Argumentittomat proseduurit ja käyttöliittymä
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 1: Rekursiivinen ajattelutapa, Scheme-kielen perusteita (mm. SICP 11.2.4) Riku Saikkonen 10. 10. 2011 Sisältö 1 Kurssijärjestelyitä 2 Perusteita Scheme-kielestä,
LisätiedotJatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006
Jatkeet TIES341 Funktio ohjelmointi 2 Kevät 2006 Havainto: häntäkutsu (1) Funktiokutsun yleinen toimintaperiaate: (koskee vain täysiä kutsuja, ts. jotka eivät palauta funktiota) kutsuja kirjaa pinoon paluuosoitteen
LisätiedotOliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä
LisätiedotSisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä
Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat
LisätiedotTIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009
TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 27. lokakuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi Kääntäjän rakenne
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman
LisätiedotSisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4
Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.
LisätiedotInformaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006
TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa
LisätiedotConcurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo
Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...
LisätiedotJAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?
JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,
LisätiedotApuja ohjelmointiin» Yleisiä virheitä
Apuja ohjelmointiin» Yleisiä virheitä Ohjelmaa kirjoittaessasi saattaa Visual Studio ilmoittaa monenlaisista virheistä "punakynällä". Usein tämä johtuu vain siitä, että virheitä näytetään vaikket olisi
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen
Lisätiedot16. Javan omat luokat 16.1
16. Javan omat luokat 16.1 Sisällys Johdanto. Object-luokka: tostring-, equals-, clone- ja getclass-metodit. Comparable-rajapinta: compareto-metodi. Vector- ja ArrayList-luokat. 16.2 Javan omat luokat
LisätiedotOpintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet Pakkaukset ja määreet Toisiinsa liittyvät luokkatiedostot voidaan koota pakkauksiksi. Luo hierarkiaa ja järjestystä ohjelmistotuotteeseen.
Lisätiedot815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.
LisätiedotSisällys. 15. Lohkot. Lohkot. Lohkot
Sisällys 15. Lohkot Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.1 15.2 Lohkot Aaltosulkeet
LisätiedotOhjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka
LisätiedotVertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004
Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10;
Lisätiedot4. Luokan testaus ja käyttö olion kautta 4.1
4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään
LisätiedotSisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä
Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat
LisätiedotOhjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 4: Perinnän käyttäminen Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 4. 2. 2012 Sisältö 1 Yksinkertainen esimerkki perinnästä
LisätiedotTehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki
Tehtävä 1 Koherentti selitys Koherentti esimerkki ½p ½p Tehtävä 2 Täysiin pisteisiin edellytetään pelaajien tulostamista esimerkin järjestyksessä. Jos ohjelmasi tulostaa pelaajat jossain muussa järjestyksessä,
LisätiedotRajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.
11. Rajapinnat 11.1 Sisällys Johdanto. Abstrakti luokka vai rajapinta? Rajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen
LisätiedotSisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen
Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät
LisätiedotLohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3
15. Lohkot 15.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.2 Lohkot Aaltosulkeet
Lisätiedot