Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Ohjelmointiprojekti I (2 ov) kevät 2003

Samankaltaiset esitykset


Esitys aiheesta: "Ohjelmointiprojekti I (2 ov) kevät 2003"— Esityksen transkriptio:

1 Ohjelmointiprojekti I (2 ov) kevät 2003
Lehtori Jussi Salmi Luentoja 10 tuntia, Ryhmätyö

2 Kurssin sisältö Appletit toimintaympäristö, filosofia
erot Java-ohjelmaan (application) rajapinnan metodit grafiikka www:n käyttö rajoitukset

3 Kurssin sisältö Tiedostojenkäsittely Poikkeustenkäsittely
erilaiset tiedostot olioiden sarjallistaminen tiedostojen käsittelyyn tarvittavat luokat erilaisia apuluokkia tekstin käsittelyyn Poikkeustenkäsittely Poikkeusten käyttötarkoitus Poikkeusten toiminnan rakenne Omien poikkeusten määrittely

4 Kurssin sisältö Javadoc-dokumentointi Tapahtumankäsittely
Javan dokumentoinnin rakenne Javadocin tagien muoto Javan dokumentoinnin käytännöt Tapahtumankäsittely Javan komponenttien rakenne Komponenttien kommunikointi Käyttöesimerkki

5 Appletit Appletit eivät ole itsenäisiä ohjelmia
WWW-sivulla kerrotaan, että halutaan ladata appletti Selain käynnistää virtuaalikoneen, jonka sisällä appletti pyörii Appletti ei näe selaimen ulkopuolelle, se voi käyttää vain selaimen palveluja Selain tarkistaa appletin oikeellisuutta Appletti voi sisältää monta luokkaa

6 Kuva selaimen ja appletin suhteesta
Selain Selaimen palvelut Virtuaalikone -Käynnistää virtuaali- koneen tarvittaessa -Kuuntelee virtuaali- koneen pyyntöjä -Toteuttaa ne, jos ne eivät riko turvalli- suusmääräyksiä ja ne on selaimessa määritelty Pyynnöt -Pyörittää applettia -Pyytää selaimelta palveluja -Saa selaimelta palvelujen tulokset -Ei voi viitata virtu- aalikoneen ”hiekka- laatikon” ulkopuolelle Vastaukset

7 Appletin käynnistäminen www-sivulta
<applet code=”sovelma.class” CODEBASE=” WIDTH=250 Height=70> <PARAM name=”etu” value=”Paavo”> <PARAM name=”suku” value=”Väyrynen”> </applet>

8 Erot Java-sovelluksiin (application)
Appletit eivät ole itsenäisiä ohjelmia, vaan ne vaativat selaimen toimiakseen Appleteista puuttuu Main-metodi Appletit on tarkoitettu ladattavaksi verkon yli, niissä pyritään keveyteen Appletit perivät Applet-luokan ”public class LuokanNimi extends Applet” Appleteissa ei ole konstruktoria Appletit toimivat aina graafisesti

9 Turvallisuusrajoitukset
Tiedostoja ei voi lukea isäntäkoneelta Verkkoyhteyden voi ottaa vain samalle palvelimelle, josta appletti ladattiin Ei voi käynnistää ohjelmia isäntäkoneelta Ei voi tutkia isäntäkoneen ominaisuuksia Ei voi käynnistää natiivimetodeja Voi käyttää vain selaimen virtuaalikoneen palveluja, ei muiden osapuolten java-pakkauksia

10 Applet-luokasta periytyvät metodit init() start() stop()
Appletin alustus, muuttujien alustus start() Selain kutsuu tätä metodia kun suoritus alkaa stop() Selain kutsuu tätä metodia, kun suoritus keskeytyy destroy() Varattujen resurssien tuhoaminen juuri ennen appletin suorituksen lopettamista

11 getParameter(String param) getDocumentBase() getCodeBase()
Hakee HTML-sivun parametrin param arvon getDocumentBase() Palauttaa HTML-sivun hakemiston URL:n getCodeBase() Palauttaa URL:n hakemistoon, josta appletin tavukoodi on ladattu paint(Graphics g) Appletin piirtävä metodi

12 getAudioClip(URL url) play(URL url)
getImage(URL url) Lataa kuvan osoitteesta url getAudioClip(URL url) Lataa äänitiedoston osoitteesta url play(URL url) Soittaa äänitiedoston osoitteesta url

13 import java.awt.Graphics;
import java.applet.*; public class Appletti extends Applet{ public void paint (Graphics g) { g.drawString(getParameter("etu"),10,10); g.drawString(getParameter("suku"),10,20); }

14 import java.awt.Graphics;
import java.applet.*; public class Initialisoitu extends Applet{ String teksti; public void init() { teksti="On käynnistetty."; } public void start() { teksti=teksti+" Ja taas."; public void paint (Graphics g) { g.drawString(teksti, 10,10);

15 Appletti on täysin graafinen olio
Appletti ja grafiikka Appletti on täysin graafinen olio Kaikki tulokset täytyy näyttää graafisesti Appletviewer kykenee näyttämään System.out.println()-tulostuksia komentorivi-ikkunassa Jotta voisi käyttää appletteja, täytyy hallita ainakin alkeet grafiikan tekemisestä appleteilla

16 Grafiikan perusteet Appletilla
Kaksi tapaa: AWT ja Swing AWT on vanhempi, mutta laajalti käytössä AWT on yksinkertaisempi AWT riittää hyvin appletteihin, jotka eivät ole valtavan monimutkaisia Swing käydään läpi APSK-kurssilla Luokka Applet kuuluu AWT:hen Swingiin liittyy luokka JApplet

17 Applet luokka toimii komponenttisäiliönä
komponentit ovat käyttöliittymän elementtejä säiliöön voi lisätä ja poistaa komponentteja säiliöön voi asettaa layout-managereita komponentit on esitelty omissa luokissaan Appletti Komponentti 2 Kompo-nentti 1 Komponentti 3

18 AWT:ssa on monta erilaista komponenttia:

19 Component on yläluokka kaikille komponenteille.
Button tavallinen painonappi, joka laukaisee toimenpiteen Canvas piirtopinta CheckBox valintaruutu Choice pudotusvalikko Label tekstilaatikko List vyörytyslista ScrollBar liu’utin

20 TextComponent luokka tekstin lukemiseen ja näyttämiseen
TextComponent luokka tekstin lukemiseen ja näyttämiseen. Tämä jakaantuu kahteen: TextArea monirivinen tekstikenttä TextField yksirivinen tekstikenttä Container on komponenttisäiliö. Nämä eivät itse näy, mutta ne sisältävät lisää säiliöitä Panel perussäiliö. Näitä on usein monta yhdessä ruudussa. Niiden avulla voi vaikkapa ryhmitellä eri komponentteja yhdeksi ryhmäksi.

21 Applet sisältää yhteistoiminnallisuuden selainten kanssa
Applet sisältää yhteistoiminnallisuuden selainten kanssa. Appletilla on piirtopinta, johon voidaan suoraan piirtää. Applettiin laitettavat muut komponentit tulevat tämän piirtopinnan päälle. ScrollPane kiinteän kokoinen alue, johon voi laittaa skrollit, kun sisältö ei enää mahdu piirtoalueelle. Window päätason säiliöluokka. Sisältää osanaan muut komponenttisäiliöt. Dialogit luovat valmiin sapluunan yksinkertaiseen kommunikointiin käyttäjän kanssa.

22 Frame Window:n alainen luokka, joka tulee koko ikkunan ja komponenttisäiliöiden väliin. Tässä on jo otsikko ja menut.

23 Toimintaperiaate Joko piirretään suoraan Appletin piirtopinnalle, jos appletti on yksinkertainen, tai Sijoitetaan komponentit applettiin, ja laitetaan komponentteihin halutut tiedot komponenteissa on metodit, joiden avulla niiden tilaa muutetaan tai tutkitaan

24 Appletin piirtopinnalle piirtäminen
Ylikirjoitetaan paint-metodi Käytetään Graphics-luokan metodeita: drawImage(Image img, int x, int y, ImageObserver observer ) piirtää ladatun kuvan (Image) paikkaan (x,y) drawLine(int x1, int y1, int x2, int y2) piirtää viivan (x1,y1) -> (x2,y2) drawOval(int x,int y,int width,int height) Piirtää ovaalin paikkaan (x,y), leveys on width ja korkeus height

25 drawPolygon(int[] xPoints,int[] yPoints, int nPoints)
piirtää polygonin drawPolyline(int[] xPoints, int[] yPoints,int nPoints) piirtää murtoviivan drawRect(int x,int y,int width,int height) piirtää suorakulmion drawString(String str,int x,int y) piirtää tekstiä annettuun paikkaan

26 getClipBounds() setColor(Color c)
palauttaa viittauksen piirtoalueen kokoon. getClipBounds().width palauttaa piirtoalueen leveyden ja .height korkeuden setColor(Color c) Vaihtaa piirtovärin. Käyttö esim. setColor(Color.black) tai setColor(new Color(0,15,200))

27 Fontin käyttö: setFont(Font f) asettaa fontin. Esim.
setFont(new Font("TimesRoman",Font.BOLD, 36)) luokka Font määrittelee fontin.

28 Skaalaus Usein tulee tilanne, että piirrettävää kuviota pitää skaalata siten, että se täyttää aina kulloisenkin piirtotilan Esim. viiva piirretään määrätyistä koordinaateista määrättyihin koordinaatteihin getClipBounds-metodilla saadaan piirtoalueen koko

29 Esim. Ajatellaan, että ruutu on 100*100 pikseliä Pitää piirtää suorakulmio, jonka vasen ylänurkka on pisteessä (10,10) ja oikea alanurkka pisteessä (90,90) Halutaan skaalata kuva eri kokoiseksi xLev=getClipBounds.width yKor=getClipBounds.height piirretään g.drawRect((int)0.1*xLev, (int)0.1*yKor, (int)0.9*xLev, (int)0.9*yKor);

30 Tiedostojen käsittely
Perusyksikkö on tiedosto Tiedosto koostuu loogisesti yhteenkuuluvista tiedoista Tiedostot tallennetaan pysyvästi levylle Levyllä olevat tiedostot sijaitsevat hakemistohierarkiassa Hakemistot käsitetään Javassa myös tiedostoiksi Javassa tiedostoa kuvaa luokka File Appletti ei voi ladata tiedostoja levyltä

31 File(String pathname)
File-luokka Konstruktorit: File(String pathname) Luo uuden File-olion, joka viittaa parametrina annettuun tiedostoon File f =new File(”tiedosto.txt”) Luo viittauksen tiedosto.txt-tiedostoon oletushakemistossa (suhteellinen osoitustapa)

32 File f=new File (”\\hakemisto\\tiedosto.txt”)
Windows-tylinen absoluuttinen osoitus. Mainitaan tiedoston koko hakupolku. Tarvitaan kaksi ”\”-merkkiä, koska yksi tunnistettaisiin erikoismerkin edeltäjäksi. File f=new File (”/hakemisto/tiedosto.txt”) UNIX (Apple) –tyylinen osoitus Käytössä olevan hakemistoeroittimen saa selville File.separator Voi käyttää File f=new File (File.separator+”hakemisto”+ File.separator+”tiedosto”)

33 boolean getAbsolutePath() boolean isFile() boolean isDirectory()
Muita metodeja boolean exists() palauttaa tosi, jos tiedosto on olemassa boolean getAbsolutePath() palauttaa absoluuttisen polun boolean isFile() palauttaa tosi, jos tiedosto on tiedosto boolean isDirectory() palauttaa tosi, jos tiedosto on hakemisto

34 Muita metodeja boolean delete() boolean mkdir() canRead() canWrite()
palauttaa epätosi, jos ei onnistunut boolean mkdir() luo hakemiston, palauttaa onnistuiko canRead() voiko lukea? canWrite() voiko kirjoittaa createNewFile() luo uuden tiedoston

35 Java-ohjelmat eivät suoraan lue laitteilta
Tiedostovirta Java-ohjelmat eivät suoraan lue laitteilta Luodaan virta (stream), joka yhdistää Java-ohjelman haluttuun tiedostoon jollain laitteella Java-ohjelma Levy Tiedostovirta

36 Tiedostovirtoja käsittelevät luokat voidaan jakaa neljään ryhmään:
InputStream-ryhmän luokat lukevat tietoa tavuittain OutputStream-ryhmän luokat kirjoittavat tietoa tavuittain Reader-ryhmän luokat lukevat tietoa merkeittäin Writer-ryhmän luokat kirjoittavat tietoa merkeittäin

37 Tiedostoja on kahta päätyyppiä:
tekstitiedosto sisältää tekstimuotoista tietoa, jota voi editorilla muokata. Esim. .java-tiedostot) binääritiedosto sisältää tietoa ei-tekstimuodossa, sen sisällön voi lukea vain jollain ohjelmalla, joka tätä tietoa tarvitsee. Esim. .class-tiedostot Ero on siis esitysmuodossa

38 Tekstitiedosto Tekstitiedostossa tiedot ovat riveittäin Rivillä on päätösmerkki (eol (end-of-line)) Tiedostoa luetaan rivi kerrallaan merkeittäin Binääritiedosto Sisältää tietoa, jota täytyy lukea tavuittain Voi olla vaikkapa kuvatiedosto, olioita

39 Tiedoston avaamisprosessi etenee seuraavasti:
Määritellään tiedosto, jota käytetään Avataan siihen tiedostovirta Luetaan (tai kirjoitetaan) tiedostovirrasta sopivalla lukijalla Sopivan lukijan valinta riippuu luettavasta tai kirjoitettavasta tiedosta

40 Käsitellään seuraavaksi tekstitiedoston lukemista
Tekstitiedoston tiedostovirta kuuluu Reader-ryhmään Ryhmän yläluokka on Reader, jonka alaluokkana on mm. BufferedReader

41 BufferedReader-luokka Konstruktori BufferedReader(Reader in)
Konstruktori vaatii parametrinaan Reader-tyyppisen parametrin, joka edustaa tiedostovirtaa. Reader on itse abstakti luokka, joten se ei käy. Olio-ohjelmoinnin sääntöjen mukaan parametriksi käy myös Readerin perillinen. Sopiva luokka tähän on FileReader. Se luo merkkien lukemisvirran parametrinaan saamaansa File-olioon.

42 Muita metodeja String readLine() int read() void close()
lukee yhden rivin tekstiä int read() lukee yhden merkin, jonka palauttaa ilman koodausta kokonaislukuna void close() sulkee tiedoston

43 void mark(long readAheadLimit)
Muita metodeja void mark(long readAheadLimit) merkitsee kohdan virrassa. Parametri kertoo kuinka monta merkkiä enintään täytyy merkintä muistaa void reset() palaa edelliseen merkittyyn kohtaan virrassa void skip(long n) ohittaa seuraavat n merkkiä virrassa

44 BufferedWriteriä käytetään vastaavasti kirjoittamaan tiedostoon
BufferedWriteriä käytetään vastaavasti kirjoittamaan tiedostoon. Sen tärkeimmät metodit ovat: void close() sulkee tiedoston void flush() kirjoittaa puskurin sisällön tiedostoon. Tällöin ei ole vaaraa, että tiedot jäävät kirjoittamatta vaikkapa ohjelman kaatumisen takia. void newLine() rivinvaihto

45 Muita metodeja void write(String st)
tämä metodi oikeastaan peritään Writer-luokasta. Se kirjoittaa tekstin st tiedostoon ilman rivinvaihtoa. Rivinvaihdon voi kirjoittaa joko käyttämällä newLine-metodia tai kirjoittamalla write(st+”\n”)

46 Binääritiedoston kirjoittaminen ja lukeminen
Periaatteet ovat samat, käytetään vain eri luokkia Nämä luokat kuuluvat InputStream ja OutputStream –ryhmiin Binääritiedostojen lukemisessa ja kirjoittamisessa eteen voi tulla kaksi tapausta: Halutaan lukea Java-olioita Halutaan lukea yleistä binääridataa

47 FileInputStream(File file) Luokan metodeja ovat: int read()
Tapauksessa 2 voidaan käyttää FileInputStream ja FileOutputStream –luokkia FileInputStream luokka avaa tiedostovirran tiedostoon. Sen konstruktori on seuraava: FileInputStream(File file) parametrina annetaan tiedosto file Luokan metodeja ovat: int read() palauttaa yhden tavun tiedostovirrasta. Tavu palautetaan kokonaislukuna.

48 Muita metodeja int read(byte[] b) void skip(long n) void close()
lukee b.length tavua taulukkoon b. Tavut ovat muodossa byte. void skip(long n) ohita n tavua virrassa void close() sulje lukuvirta

49 FileOutputStream(File file)
avaa kirjoitusvirran tiedostoon file FileOutputStream(File file, boolean append) avaa kirjoitusvirran. Jos append on tosi, lisätään tavut tiedoston loppuun. Luokan metodeja: void write(int b) kirjoittaa tavun kirjoitusvirtaan

50 Muita metodeja void write(byte[] b) void close() void flush()
kirjoittaa taulukon b kirjoitusvirtaan void close() sulkee tiedoston void flush() tyhjentää kirjoitusvirran tiedostoon. Tällöin vältetään tavujen menetys ohjelman kaatuessa.

51 Tapaus 1:ssä haluttiin tallentaa olioita.
Jotta oliot voisi tallentaa, ne täytyy sarjallistaa

52 Sarjallistaminen Normaalisti oliot ovat muistissa jossain kohtaa, eivät välttämättä yhdessä kohtaa Tavukoodissa tallennetaan luokan koodi, ei erillisten olioiden sisältöjä Niiden attribuutit voisi tallentaa erikseen, mutta tällöin monimutkaisten olioiden tallentaminen olisi tavattoman työlästä Ratkaisu ongelmaan on sarjallistaminen (serialization): oliot koodataan tavupötköksi, joka sitten kirjoitetaan levylle

53 Sarjallistamiseen vaaditaan, että luokka toteuttaa Serializable-rajapinnan. Tämä rajapinta ei vaadi oliolta mitään, se vain kertoo kääntäjälle, että olio saatetaan sarjallistaa Kun olio sarjallistetaan, se muutetaan tavupötköksi, kun se luetaan tavupötkö muutetaan olioksi.

54 ObjectInputStreamin metodit: ObjectInputStream(InputStream in)
Oliot voidaan tallentaa levylle käyttäen edellä mainittuja FileInputStreamia ja FileOutputStreamia. Tällöin täytyy näiden lisäksi käyttää ObjectInputStream ja ObjectOutputStream –luokkia, jotka hoitavat sarjallistamisen ObjectInputStreamin metodit: ObjectInputStream(InputStream in) luo uuden lukuvirran. Parametrina käy vaikka FileInputStream-olio, jollaisia edellä käsiteltiin.

55 Object readObject() lukee olion lukuvirrasta. Koska Javassa kaikki luokat ovat luokan Object periviä, voi tällä metodilla lukea minkä tahansa olion. Lisäksi luokassa ovat samat close(), mark() ja reset() metodit kuin BufferedReader-luokassa.

56 writeObject(Object obj)
ObjectOutputStream ObjectOutputStream(OutputStream out) konstruktorissa voidaan käyttää parametrina FileOutputStream –oliota Muita metodeja: writeObject(Object obj) metodi kirjoittaa objektin, jonka voi lukea ObjectInputStreamin avulla Lisäksi käytössä ovat normaalit close() ja flush() -operaatiot

57 Esimerkki. Kirjoitetaan ja luetaan kolme oliota käyttäen tiedostoa t
Esimerkki. Kirjoitetaan ja luetaan kolme oliota käyttäen tiedostoa t.tmp. FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(12345); oos.writeObject("Today"); oos.writeObject(new Date()); oos.close();

58 FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis); int i = ois.readInt(); String today = (String) ois.readObject(); Date date = (Date) ois.readObject(); ois.close();

59 Tekstitiedoston parserointi
Parserointi tarkoittaa jäsentelyä tutkitaan, miten voidaan lukea monimutkaisesta tekstitiedostosta halutut kohdat Periaatteena on, että tunnetaan tiedoston formaatti, ja tiedetään missä kohtaa halutut tiedot ovat Voidaan myös tuntea tekstin seasta avainsanoja, joiden jälkeen tiedetään seuraavan haluttu tieto

60 StringTokenizer(String str, String delim)
Apuna käytetään StringTokenizer-luokkaa, jonka avulla voidaan paloitella merkkijono osiin: StringTokenizer(String str, String delim) luo Stringtokenizer-olion parametri str on merkkijono, joka halutaan jäsentää parametri delim on erotin merkkijonon eri osien välillä

61 boolean hasMoreTokens() int countTokens()
Metodeja: String nextToken() palauttaa seuraavan osan tekstiä boolean hasMoreTokens() kertoo, onko vielä tekstiä käsittelemättä int countTokens() palauttaa jäljellä olevien tekstin osien määrän

62 Esim.: käsitellään opiskelijaa kuvaava merkkijonoa
mjono=”paavo;väyrynen;TKT;2000”; StringTokenizer st=new StringTokenizer(mjono,”;”); String nimi=st.nextToken(); String suku=st.nextToken(); String ko=st.nextToken(); int aloitusvuosi=Integer. parseInt(st.nextToken());

63 Verkkoyhteyksien käyttäminen
Javassa voi ottaa monenlaisia verkkoyhteyksiä Voi lukea sivuja HTTP-protokollalla Voi kutsua hajautettuja sovelluksia Voi ottaa socket-yhteyden Tutkitaan ensin pintapuolisesti vaihtoehtoa 3

64 Socket-yhteys Socket on kaksisuuntaisen keskusteluyhteyden toinen pää Palvelin kuuntelee yhteydenottopyyntöjä tietyssä portissa socketilla Asiakas lähettää yhteyspyynnön

65 Palvelin ottaa yhteyspyynnön vastaan ja antaa asiakkaan käyttöön uuden socketin, joka on jossain toisessa portissa Sitten palvelin jatkaa yhteydenottoportin kuuntelua, josko muutkin haluaisivat yhteyttä Asiakas kommunikoi palvelimen kanssa

66 Socketteja voidaan käyttää Javassa java
Socketteja voidaan käyttää Javassa java.net-paketissa olevan Socket-luokan avulla. Socketit ovat alhaisen tason keskusteluväline HTTP-yhteydet käyttävät socketteja toteutuksessaan Java appletit eivät voi ottaa socket-yhteyksiä muualle kuin siihen palvelimeen, josta ne ladattiin

67 Hajautetut sovellukset
Javassa voidaan sovelluksia hajauttaa Tämä tapahtuu mahdollistamalla metodikutsut verkon yli Yhdelle koneella toimiva ohjelma voi esittää metodikutsuja normaaliin tapaan käyttäen RMI-protokollaa Samalla voi siirtää parametreissa tietoa Hyvin tehokas korkean tason järjestelmä

68 HTTP-protokollan käyttö
Javassa voi luoda HTTP-yhteyksiä Appletit eivät saa ottaa HTTP-yhteyksiä muualle kuin siihen koneeseen, josta ne ladattiin Java-sovellukset voivat käyttää HTTP-yhteyksiä vapaasti Ei vaadi www-palvelimelta mitään ylimääräistä

69 HTTP-yhteydet määrittelee URL-osoite
URL=Uniform Resource Locator URL:n muoto on seuraava: URL koostuu siis kahdesta osasta, joita erottaa kaksoispiste Ensimmäisenä on protokolla, jota käytetään, toisena osoite, johon viitataan

70 URL-osoite voi viitata monenlaiseen protokollaan:
ftp://ftp.mozilla.org/ Myös Gopher, News, File-protokollat Osoitteessa näkyy protokolla, palvelin ja polku haluttuun tiedostoon. Pelkkä / palvelimen jälkeen tarkoittaa index.html-tiedostoa

71 URL(String protocol, String host, String file)
Javassa mallinnetaan URL:ää luokalla URL, joka löytyy java.net-paketista URL-luokka: konstruktori: URL(String spec) spec-parametri on URL-osoite URL(String protocol, String host, String file) Määritellään kaikki erikseen

72 Tiedostojen lukeminen URL:stä
Tiedostojen lukemiseen tarvitaan lukuvirta URL:stä saadaan lukuvirta käyttämällä URL-luokan openStream-metodia: InputStream openStream() Metodi palauttaa InputStream-tyyppisen lukuvirran Tämä on siis tavuittain lukeva lukuvirta Sitä voidaan käyttää yhdessä vaikkapa ObjectInputStreamin kanssa lukemaan sarjallistettuja olioita

73 Seuraava ohjelma käyttää ObjectInputStreamia olioiden lukemiseen aiemmasta esimerkistä, jossa talletettiin muutama olio levylle Huom! luettavan tiedoston tulee olla samalla palvelimella kuin appletti Tuloksena näytetään yhden olion sisältö Label-tyyppisessä tekstipalkissa Samalla tavalla voitaisiin lukea muitakin binääritiedostoja verkon yli

74 try { URL sivu = new URL(" ObjectInputStream p = new ObjectInputStream(sivu.openStream()); int i = p.readInt(); String today = (String)p.readObject(); Date date = (Date)p.readObject(); p.close(); Label label = new Label(today); add(label); } catch (Exception e) {}

75 Tekstitiedostojen lukeminen
Aiemmin käytettiin Reader-tyyppistä tiedostovirtaa tekstitiedostojen lukemiseen URL-luokassa on kuitenkin vain metodi tavutyyppisen tiedon lukemiseen On kuitenkin olemassa luokka InputStreamReader, joka mahdollistaa tavujen lukemisen virrasta merkkeinä Tekstiä voidaan lukea sitä käyttäen lisäksi voidaan käyttää mitä tahansa haluttua lukijaa merkkien lukemiseen

76 Esimerkki tekstitiedoston lukemiseen verkon yli käyttäen BufferedReader-luokkaa
BufferedReader vaatii konstruktorissaan jonkin Reader-tyyppisen olion InputStreamReader on itse Readerin perillinen, mutta se vaatii konstruktorissaan InputStream-tyyppistä parametria Niinpä se käy BufferedReaderille ja hyväksyy openStream-metodin palauttaman InputStream-virran

77 try { URL url = new URL(" InputStreamReader isr= new InputStreamReader( url.openStream()); BufferedReader br=new BufferedReader(isr); String teksti=isr.readLine(); isr.close(); } catch (Exception e) {}

78 Tiedostoon kirjoittaminen verkon yli
Tämä on paljon vaikeampaa Lukemisessa riittää, kun luettava tiedosto on laitettu oikeaan paikkaan palvelimelle Kirjoittamisessa täytyy jonkun olla palvelimen päässä kuuntelemassa kirjoituspyyntöjä Appletissa on helppoa lähettää kirjoituskutsuja Tällä kurssilla ei tarvitse oppia kirjoitusta

79 URL-luokassa on metodi URLConnection openConnection()
avaa yhteyden URL:ään palauttaa URLConnection-olion, jota voi käyttää niin lukemiseen kuin kirjoittamiseen openStream-metodi käyttää oikeastaan myös openConnection-metodia URLConnection-luokassa on metodi void setDoOutput (boolean dooutput) laitetaan dooutput todeksi, jolloin voidaan kirjoittaa seuraavan esimerkin mukaisesti

80 Kirjoittaminen tapahtuu hyväksikäyttäen cgi-bin-menetelmää
Tällöin palvelimella on määrätty cgi-bin hakemisto, johon sijoitetaan ohjelmat, jotka osaavat käsitellä verkon yli tulevaa tietoa. Jotta seuraava ohjelma toimisi, tulee palvelimella java.sun.com olla olemassa cgi-bin –hakemistossa ohjelma backwards Samalla menetelmällä toimivat mm. verkossa täytettävät HTML-lomakkeet

81 URL url = new URL("http:// java.sun.com/cgi-bin/backwards");
URLConnection c = url.openConnection(); c.setDoOutput(true); PrintWriter out = new PrintWriter(c.getOutputStream()); out.println(“morjens!”); out.close();

82 Poikkeustenkäsittely
Ohjelmia suoritettaessa tulee tilanteita, jolloin suorituksessa oleva metodi ei pysty jatkamaan suoritusta Tämä voi johtua virheellisestä syötteestä tai vaikkapa jonkin ohjelman ulkopuolelta pyydetyn palvelun epäonnistumisesta Tällainen voi tapahtua vaikkapa tilanteessa, jossa tiedoston luku tai verkkoyhteyden otto epäonnistuu

83 Ensimmäiseksi metodi yrittää toipua virheestä. Tämä ei aina onnistu.
Tämä jälkeen seuraa tilanne, jossa ongelma on hoidettava ylemmällä tasolla. Metodi itse ei välttämättä tiedä, mihin kokonaisuuteen epäonnistunut tehtävä kuului, ja miten se vaikuttaa ohjelman suorituksessa eteenpäin Muissa ohjelmointikielissä tämä tilanne voitaisiin hoitaa lopettamalla aliohjelman suoritus ja palauttamalla tieto virheestä

84 Javassa on kuitenkin käytössä erillinen poikkeuskäsittely
Poikkeus on ilmoitus kohdatusta virhetilanteesta Tällöin metodi virheen kohdatessaan, kun se ei pysty itse virheestä toipumaan, nostaa poikkeuksen. Poikkeus lopettaa metodin suorituksen, kontrolli palaa metodia kutsuneelle metodille

85 Tämä ratkaisee, osaako se toipua kohdatusta virheestä
Jos luokassa ei ole virheenkäsittelyosiota, jatkaa poikkeus ylemmälle tasolla Poikkeus palaa ylöspäin kutsupinossa, kunnes joku sen käsittelee Jos ei kukaan osaa käsitellä, ohjelman suoritus päättyy

86 Poikkeus on teknisesti toteutettu luokkana sekä mekanismina poikkeuksien välittämiseen
Luokan attribuutit kertovat millaisesta virhetilanteesta on kysymys ja minkä metodien kautta virhe on tullut Poikkeusten käsittelymekanismi on seuraava:

87 try { } määrittelee lohkon, josta voi syntyä poikkeus
Mikäli metodissa suoritetaan operaatioita, jotka voivat nostaa poikkeuksen, täytyy ne laittaa try-lohkoon try-lohkon jälkeen on catch –lohko, jossa virheet käsitellään catch-lohkoja voidaan määritellä useita erilaisille virhetilanteille finally-lohkossa estitetään toimenpiteet, jotka suoritetaan joka tapauksessa

88 Poikkeuksia on kiinniotettavia (checked) ja läpipäästettäviä (unchecked).
Läpipäästettäviä ei tarvitse ottaa kiinni try-catch-rakenteella Läpipäästettävät poikkeukset ovat RuntimException-luokan perillisiä Muut poikkeukset täytyy ottaa kiinni, tai ne täytyy määritellä metodin otsikossa throws-määreellä. throws-määre kertoo, metodi lähettää eteenpäin määreessa ilmoitetun virheen

89 try { File f=new File(”uusi”); f.createNewFile(); //throws IOException } catch (IOException e) { //käsitellään IO-poikkeus finally { //suoritetaan joka tapauksessa

90 public void esim(File f) throws IOException {
f.createNewFile(); }

91 Luokka Throwable on kaikkien Javan virheitä käsittelevien luokkien yliluokka
Sen jälkeläiset jakaantuvat kahteen ryhmään: Error ja sen jälkeläiset ovat vakavia ongelmia, jotka eivät liity Javan tavalliseen käyttöön; ohjelmoijan ei tarvitse niistä välittää Exception käsittelee normaaleja virhetilanteita, jotka voivat liittyä normaaliin ohjelman toimintaan

92 Exception(String message)
Luokka Exception konstruktorit Exception(String message) Luo uuden poikkeuksen, johon liittyy virheilmoitus message Exception(String message, Throwable cause) Tähän liittyy myös poikkeuksen syy, joka on itsessään jokin poikkeus. Tarkoituksena on välittää viesti siitä, mikä virheen aiheutti. Käyttäen tätä ylempi taso ei ole sidottu alemman tason toteutukseen.

93 try { lowLevelOp(); } catch (LowLevelException le) { throw new HighLevelException(le); // ketjuuntuva konstruktori

94 Omien poikkeusten määrittely Poikkeuksia voi itse määritellä
Käyttäen jo olemassa olevia poikkeuksia Periyttämällä oman poikkeusluokan Exception-luokasta Tapauksessa 1 voidaan toimia vaikkapa näin:

95 public void tutkiLuku(int l) throws Exception {
final int MIN=10; final int MAX=25; Exception ongelma= new Exception (”Luku ei ole arvovälillä”); if (l<MIN || l>MAX) { throw ongelma; }

96 Tapauksessa 2 pitää periä Exception-luokka, muuten Java ei ymmärrä kyseessä olevan poikkeuksen
Tällöin voidaan poikkeukseen määritellä omia toimintoja kuten yleensäkin perittäessä Yleisesti ottaen kuitenkin perityn poikkeuksen tärkein anti on se, että sen nimi kuvastaa tapahtunutta tilannetta Edellinen esimerkki käyttäen omaa poikkeusta

97 public class LukuKelvoton extends Exception {
public LukuKelvoton(String v) { super(v); }

98 public void tutkiLuku(int l) throws LukuKelvoton {
final int MIN=10; final int MAX=25; LukuKelvoton ongelma= new LukuKelvoton (”Luku ei ole arvovälillä”); if (l<MIN || l>MAX) { throw ongelma; }

99 Java-ohjelmien dokumentointi
Dokumentaatiolla on monta tehtävää Dokumentaatio kertoo ohjelmoijalle, mitä hän on ohjelmaa kirjoittaessaan ajatellut ohjelmansa tekevän. Dokumentaatio kertoo muille kuin ohjelmoijalle, mitä ohjelma tekee. Tätä tarvitaan, kun he joutuvat ylläpitämään sitä Dokumentaatio voi sisältää oikeellisuuden toteamiseen tarkoitettuja väitteitä Dokumentaatio toimii käyttöohjeena

100 Dokumentaatiota on monenlaista Ohjelmakoodin kommentointi
Ohjelman sekaan kirjoitetut kommentit Auttavat ohjelmakoodin toiminnan ymmärtämistä Hyödyllistä, kun ohjelmaa pitää muuttaa Ohjelmakoodin koottu tekninen dokumentointi Kertoo, mitä metodeja tai luokkia ohjelmassa on, ja miten niitä käytetään Auttaa ymmärtämään ohjelman korkeamman tason toimintalogiikkaa

101 Ohjelman käyttäjälle suunnattu dokumentaatio
Tällaista dokumentaatiota tarvitsee henkilö, joka käyttää luokkia ja metodeja hyödyksi omassa ohjelmassaan Ohjelman käyttäjälle suunnattu dokumentaatio Ei kuvaa ohjelman sisäistä toimintaa, vaan kertoo miten sitä käytetään

102 Ohjelmakoodin kommentointi on eri kielissä samankaltaista
Syntaksi kommenttien kirjoittamiseen vaihtelee Javassa kommentin erottimena toimii ”//” yksiriviselle kommentille ”/* kommentti */” moniriviselle kommentille Samat kommentointikonventiot ovat käytössä myös C++:ssa

103 Ohjelmakoodin teknisessä dokumentoinnissa Javassa on käytössä apuväline, JavaDoc
JavaDoc nojautuu tietyllä formaatilla kirjoitettuun kommentointiin Dokumentoinnilla saadaan aikaiseksi luokkien kuvaukset sekä metodien kuvaukset parametreineen, palautusarvoineen sekä poikkeuksineen helposti luettaviksi HTML-tiedostoiksi

104 JavaDoc-kommenttien formaatti
/**Tämän metodin tarkoituksena *on palauttaa kahdesta luvusta *suurempi. *<p> *Metodi palautuu aina x Toinen luku y Toinen luku suurempi parametreista x ja y see Integer

105 Tehtävänanto juuri sellaisena kuin se on sovittu tai määritelty
Harjoitustyön dokumentoinnista tulisi käydä ilmi ainakin seuraavat asiat: Tehtävänanto juuri sellaisena kuin se on sovittu tai määritelty Ratkaisun periaatteet Missä ympäristössä tehtävä on ratkaistu Ratkaisun tunnetut ongelmat Mahdollisuudet jatkokehitykseen Ratkaisun yksityiskohtaisempi kuvaus Mitä luokkia ja metodeja on käytetty, mikä on niiden rooli kokonaisuuden kannalta

106 4. Testiajot 5. Ohjelmakoodi
Pääasialliset tavat, miten kutsut tapahtuvat 4. Testiajot Mikäli kyseessä on graafinen ohjelma, dokumenttiin tulee laittaa selostus siitä, mitä testejä ohjelmalle on tehty sekä kuvaruutukaappauksia ohjelman toiminnasta Jos ohjelma antaa tuloksensa tekstinä komentoriville tai tiedostoon, on tulosteet syytä laittaa mukaan 5. Ohjelmakoodi Ohjelmakoodi liitetään dokumenttiin liitteenä

107 Tapahtumankäsittely Applettiin ja tavalliseen sovellukseen voi lisätä graafisia komponentteja, kuten painonappuloita ja valintaruutuja. Niihin voi kirjoittaa tekstiä, piirtää kuvia yms., mutta hyödyllistä olisi myös, jos ne voisivat käynnistää jotain toimenpiteitä Tähän tarvitaan tapahtumankäsittelyä Tapahtuma (event) on luokka, joka kuvaa jotain tapahtunutta toimenpidettä, eri tapahtumatyypeille on omat luokkansa

108 Käyttäjän toimenpiteet, kuten painonappulan painaminen, generoivat tapahtuman.
Tapahtumat sisältävät tietoa siitä, mikä komponentti ne on generoinut, mitä nappulaa käyttäjä on painanut

109 Hiireen liittyvät tapahtumat (MouseEvent):
hiiren nappulaa on painettu hiiren nappula on vapautettu hiirellä on klikattu hiiri saapuu komponentin päälle hiiri poistuu komponentin päältä Hiiren liikkeet generoivat ylläolevat tapahtumat sille komponentille, jonka päällä hiiri sattuu olemaan, jos komponentti ottaa ne vastaan.

110 Komponentti ei reagoi tapahtumiin, ellei sille ole määritelty tapahtumankäsittelijää näille tapahtumilla Hiiren liikkeitä käsittelee MouseMotionListener-tapahtumankäsittelijä-rajapinta Hiiren nappuloiden painalluksia käsittelee MouseListener-tapahtumankäsittelijä-rajapinta Tässä rajapinnassa on seuraavat metodit

111 void mouseClicked(MouseEvent) void mouseEntered(MouseEvent)
Kutsutaan kun hiiren nappulaa napsautetaan void mouseEntered(MouseEvent) Kutsutaan kun hiiri osuu komponentin alueelle void mouseExited(MouseEvent) Kutsutaan kun hiiri häipyy alueelta void mousePressed(MouseEvent) Kutsutaan, kun hiiren nappula painetaan alas void mouseReleased(MouseEvent) Kutsutaan kun edelläoleva tilanne päättyy

112 Tällä oliolla on mm. seuraavat metodit: public int getButton()
Kaikki edellämainitut metodit saavat parametrina MouseEvent-tyyppisen tapahtumaolion Tällä oliolla on mm. seuraavat metodit: public int getButton() mitä nappia painettiin (1=vasen, 3=oikea) public int getClickCount() Kuinka monta klikkausta tapahtui public int getX() missä tapahtuma tapahtui

113 Graafisten komponenttien käyttäminen tapahtumankäsittelijöiden kanssa
Graafisia komponentteja olivat AWT:ssa seuraavat mm.: Button, CheckBox, Choice, List, TextArea, TextField Näihin voi liittyä toimintoja kuten nappulan painaminen, valinnan tekeminen listasta, kirjaimen kirjoittaminen tekstikenttään jne. Tapahtumat käsitellään asiaanliittyvillä tapahtumankäsittelijöillä

114 Katsotaan, miten tapahtuma käsitellään Buttonin tapauksessa
Tarpeellinen tapahtumankäsittelijä on ActionListener-rajapinta Tässä on vain yksi toteutettava metodi: void actionPerformed( ActionEvent e) Kutsutaan, kun nappulaan kohdistuu tapahtuma Tapahtumaa kuvaa ActionEvent-luokka

115 ActionEvent-luokka ActionEvent kuvaa tapahtumaa kuten nappulan painamista Button-tyyppisessä komponentissa ActionListener–rajapinnan toteuttavassa luokassa nappulan painallus aiheuttaa kutsun metodille actionPerformed(ActionEvent e) Parametrina välitetään ActionEvent-olio

116 Luokan tärkeimmät metodit: public String getActionCommand()
palauttaa esim. nappulan tekstin public int getModifiers() palauttaa tiedon, painettiinko samalla Shift, Control, tms. näppäimiä

117 Muita tapahtumankäsittelijöitä WindowListener ComponentListener
kuuntelee, sulkeutuuko ikkuna ComponentListener kuuntelee, tuleeko graafinen komponentti näkyville FocusListener kuuntelee, aletaanko komponenttiin kirjoittaa ListSelectionListener kuuntelee, tehdäänkö listasta valinta

118


Lataa ppt "Ohjelmointiprojekti I (2 ov) kevät 2003"

Samankaltaiset esitykset


Iklan oleh Google