/** Ajaa järjestämisohjelman. Ohjelman käyttöliittymä kyselee käyttäjältä järjestettävien kirjojen tiedot. Lopetus kun
syöttää tyhjän merkkijonon tekijanNimen kohdalle.
Tulostaa kirjat järjestyksessä. */
public void aja() {
try {
do {
tekijanNimi = lukija.lueMerkkijono ("Anna kirjailijan nimi: ");
kirjanNimi = lukija.lueMerkkijono ("Anna kirjan nimi: ");
ilmestymisvuosi=lukija.lueKokonaisluku("Anna ilmestymisvuosi: ");
sivujenMaara=lukija.lueKokonaisluku ("Anna sivujen määrä: ");
} while (tekijanNimi.length() > 1);
}catch(KelvottomatTeoksenTiedot(virhe)) {
System.out.println("Teoksen
tiedot kelvottomat.");
}
}
______________________________________________
Osaisiko kukaan neuvoa, miksi seuraava virheilmoitus? Lisäksi while-silmukan jatkamis-
ehdossa NullPointerException? Olen kokeillut vaikka mitä.
kosh exercise_2 62 % javac Jarjestamisohjelma.java
Jarjestamisohjelma.java:52: expected
} catch (KelvottomatTeoksenTiedot(virhe)) {
^
Kiitos mahdollisista vastauksista :)
-julia
syöttää tyhjän merkkijonon tekijanNimen kohdalle.
Tulostaa kirjat järjestyksessä. */
public void aja() {
try {
do {
tekijanNimi = lukija.lueMerkkijono ("Anna kirjailijan nimi: ");
kirjanNimi = lukija.lueMerkkijono ("Anna kirjan nimi: ");
ilmestymisvuosi=lukija.lueKokonaisluku("Anna ilmestymisvuosi: ");
sivujenMaara=lukija.lueKokonaisluku ("Anna sivujen määrä: ");
} while (tekijanNimi.length() > 1);
}catch(KelvottomatTeoksenTiedot(virhe)) {
System.out.println("Teoksen
tiedot kelvottomat.");
}
}
______________________________________________
Osaisiko kukaan neuvoa, miksi seuraava virheilmoitus? Lisäksi while-silmukan jatkamis-
ehdossa NullPointerException? Olen kokeillut vaikka mitä.
kosh exercise_2 62 % javac Jarjestamisohjelma.java
Jarjestamisohjelma.java:52: expected
} catch (KelvottomatTeoksenTiedot(virhe)) {
^
Kiitos mahdollisista vastauksista :)
-julia
Vastaukset 22
Vanhimmat
Rivi:
}catch(KelvottomatTeoksenTiedot(virhe)) {
näyttää hieman omituiselta.. Yleensähän catch-rakenteen syntaksi menee näin:
} catch (Exception ex) {
Catch:n sisältä voi taas sitten heitellä omia exceptineita tyyliin:
throw new SomeOwnException("höpöhöpö");
Toinen juttu, mikä saattaa yskiä: Laita virheilmoteksti "Teoksen tiedot kelvottomat" samalle riville.
Toivottavasti tästä oli teekkarille apua..
kiitos avusta :)
Edellinen virheilmoitus hävisi, mutta tuli uusi
tilalle.
kosh exercise_2 112 % javac Jarjestamisohjelma.java
Jarjestamisohjelma.java:52: unreported exception KelvottomatTeoksenTiedot; must be caught or declared to be thrown
throw new KelvottomatTeoksenTiedot("höpöhöpö");
^
1 error
kosh exercise_2 113 %
Vaikka justhan mä sen virheen catchaan :(
Auttaisiko vielä joku kiltti.
_________________________________________________
try {
do {
tekijanNimi = lukija.lueMerkkijono("Anna kirjailijan nimi: ");
kirjanNimi = lukija.lueMerkkijono("Anna kirjan nimi: ");
ilmestymisvuosi = lukija.lueKokonaisluku("Anna ilmestymisvuosi: ");
sivujenMaara = lukija.lueKokonaisluku("Anna sivujen määrä: ");
} while (tekijanNimi.length() > 1);
} catch (Exception ex) {
throw new KelvottomatTeoksenTiedot("höpöhöpö");
}
Pääset helpoimmin eteenpäin kun korvaat rivin:
throw new KelvottomatTeoksenTiedot("höpöhöpö");
jollain "kevyemmällä" virheenkäsittelyrivillä, esim tällä:
System.out.println("virhe XX kohdassa XX");
Tuolla pitäisi päästä eteenpäin.
Tuo "throw new" -rakenne olisi vaatinut toimiakseen erillisen määrittelyn samalle riville jolla aloitetaan metodi. Esim näin:
public String jokuMetodi() throws KelvottomatTeoksenTiedot {
Homman juju on siinä, että mikäli yksittäiset metodit voivat "heittää" virheitä eteenpäin, niin silloin ne voidaan käsitellä keskitetysti yhdessä paikassa. Kun ohjelmiston koko kasvaa, niin tästä toimintatavasta tulee välttämättömyys.
Aikaisempi ongelma hävisi (jotenkin kummasti lopulta), mutta olisi vielä yksi probleema.
Mitäköhän ohjelman käynnistysmetodiin
main pitäisi kirjoittaa jotta ohjelma käynnistyisi. Olen ihan pulassa kun huomisiltana
deadline. Olisin tosi kiitollinen vinkeistä.
-Julia
______________________________________________
public class Jarjestamisohjelma {
public Jarjestamisohjelma() {
this.lukija = lukija;
this.tekijanNimi = tekijanNimi;
this.kirjanNimi = kirjanNimi;
this.ilmestymisvuosi = ilmestymisvuosi;
this.sivujenMaara = sivujenMaara;
this.kaikkiTiedot = kaikkiTiedot;
}
public void aja() {
try {
do {
Kirja kirjanTiedot = new Kirja(tekijanNimi, kirjanNimi, ilmestymisvuosi, sivujenMaara); $
tekijanNimi = lukija.lueMerkkijono("Anna kirjailijan nimi: ");
kirjanNimi = lukija.lueMerkkijono("Anna kirjan nimi: ");
ilmestymisvuosi = lukija.lueKokonaisluku("Anna ilmestymisvuosi: ");
sivujenMaara = lukija.lueKokonaisluku("Anna sivujen määrä: ");
} while (tekijanNimi.length() > 1);
} catch (KelvottomatTeoksenTiedot teksti) {
}
}
/** Käynnistysmetodi luo uuden järjestämisohjelmaolion ja laittaa sen käyntiin. Parameters: komentoriviparametrit - (ei käytössä) */
public static void main(String[] komentoriviparametrit) {
//Jarjestamisohjelma jarkkariolio = new Jarjestamisohjelma(); ???
//jarkkariolio.jarjesta(lista); ??
//jarkkariolio.aja(); ??
}
} // Jarjestamisohjelma loppuu
____________________________________
Lisäksi toisessa luokassa Tyokalupakki.java
minulla on järjestämismetodi jarjesta(List lista).
ai olitkin ehtinyt tässä välissä vastata kun
räpeltelin koodin kanssa kaikenlaista. :)
Se näytti sitten lopulta menevän läpi tälleenkin
try {
} catch (KelvottomatTeoksenTiedot seliseli) {
}
ettei reagoi catchiin muuten kuin sieppaamalla sen. Siihen samaan lohkoon voi varmaan laittaa sen System.out.print("jotain").
Kiitos! :) :)
/**
Luokka Jarjestamisohjelma tarjoaa yksinkertaisen merkkipohjaisen
käyttöliittymän, jonka avulla voi kokeilla Tyokalupakki-luokan
järjestämismetodin toimintaa. Ohjelmalla järjestetään Kirja-olioita.*/
public class Jarjestamisohjelma extends Object {
private Nappiksenlukija lukija;
private Kirja kaikkiTiedot;
private String kirjarivi;
private String kaikkitiedot;
private String tekijanNimi;
private int ilmestymisvuosi;
private int sivujenMaara;
private String kirjanNimi;
public Jarjestamisohjelma() {
this.lukija = lukija;
this.tekijanNimi = tekijanNimi;
this.kirjanNimi = kirjanNimi;
this.ilmestymisvuosi = ilmestymisvuosi;
this.sivujenMaara = sivujenMaara;
this.kaikkiTiedot = kaikkiTiedot;
}
/** Ajaa järjestämisohjelman. Ohjelman käyttöliittymä kyselee
käyttäjältä järjestettävien kirjojen tiedot. Lopetus kun
syöttää tyhjän merkkijonon tekijanNimen kohdalle.
Tulostaa kirjat järjestyksessä. */
public void aja() {
try {
do {
Kirja kirjanTiedot = new Kirja(tekijanNimi, kirjanNimi,
ilmestymisvuosi, sivujenMaara);
tekijanNimi = lukija.lueMerkkijono("Anna kirjailijan nimi: ");
kirjanNimi = lukija.lueMerkkijono("Anna kirjan nimi: ");
ilmestymisvuosi = lukija.lueKokonaisluku("Anna ilmestymisvuosi: ");
sivujenMaara = lukija.lueKokonaisluku("Anna sivujen määrä: ");
} while (tekijanNimi.length() > 1);
} catch (KelvottomatTeoksenTiedot seliseli) {
}
}
/** Käynnistysmetodi luo uuden järjestämisohjelmaolion ja laittaa
sen käyntiin. Parameters: komentoriviparametrit - (ei käytössä) */
public static void main(String[] komentoriviparametrit) {
// mitäköhän tässä pitäisi suunnilleen lukea?
//Jarjestamisohjelma jarkkariolio = new Jarjestamisohjelma(); ???
//jarkkariolio.jarjesta(lista); ??
//jarkkariolio.aja(); ??
}
}
Hiukka hankalaa tämä ohjelmointi ilman tarkempia tietoja.. :) Mutta tässä vielä lisäosviittaa ohjelmarunkoon puettuna.. En missän tapauksessa väitä, että tuo ohjelma toimii tuollaisenaan, mutta ehkä rakenteen kertaalleen läpikatselemalla saat uusia ajatuksia..
// tarvitset pari viittausta
import java.util.Vector;
import java.util.Enumeration;
/**
Luokka Jarjestamisohjelma tarjoaa yksinkertaisen merkkipohjaisen
käyttöliittymän, jonka avulla voi kokeilla Tyokalupakki-luokan
järjestämismetodin toimintaa. Ohjelmalla järjestetään Kirja-olioita.*/
public class Jarjestamisohjelma extends Object {
private Nappiksenlukija lukija;
private Kirja kaikkiTiedot;
private String kirjarivi;
private String kaikkitiedot;
private String tekijanNimi;
private int ilmestymisvuosi;
private int sivujenMaara;
private String kirjanNimi;
// instantioidaan uusi Vector
private Vector kaikkiKirjat = new Vector();
public Jarjestamisohjelma() {
// näitä ei kyllä mielestäni tarvita lainkaan..
this.lukija = lukija;
this.tekijanNimi = tekijanNimi;
this.kirjanNimi = kirjanNimi;
this.ilmestymisvuosi = ilmestymisvuosi;
this.sivujenMaara = sivujenMaara;
this.kaikkiTiedot = kaikkiTiedot;
}
/** Ajaa järjestämisohjelman. Ohjelman käyttöliittymä kyselee
käyttäjältä järjestettävien kirjojen tiedot. Lopetus kun
syöttää tyhjän merkkijonon tekijanNimen kohdalle.
Tulostaa kirjat järjestyksessä. */
public void aja() {
try {
do {
tekijanNimi = lukija.lueMerkkijono("Anna kirjailijan nimi: ");
kirjanNimi = lukija.lueMerkkijono("Anna kirjan nimi: ");
ilmestymisvuosi = lukija.lueKokonaisluku("Anna ilmestymisvuosi: ");
sivujenMaara = lukija.lueKokonaisluku("Anna sivujen määrä: ");
// uusi Kirja voidaan tehdä vasta täällä, koska muuten emme tiedä käyttäjän
// syötteitä..
Kirja kirjanTiedot = new Kirja(tekijanNimi, kirjanNimi, ilmestymisvuosi, sivujenMaara);
// talleta juuri syntynyt Kirja säiliöön
kaikkiKirjat.add(kirjanTiedot);
} while (tekijanNimi.length() > 1);
// kun luuppi on valmis, olet saanut Vector:iin kaikki Kirja:t.
// Nyt ne pitäisi järjestää jollain tavalla. Seuraava tuskin toimii,
// mutta periaate selvinnee..
// instantio uusi tkp
Tyokalupakki tkp = new Tyokalupakki();
// anna jarjesta-metodille syötteeksi kaikkiKirjat.
// HUOMHUOM: on epäselvää, huoliikoo tuo jarjesta-metodi Vectorin.
tkp.jarjesta(kaikkiKirjat);
// Kun järjestäminen on tehty, kirjat pitäisi ilmeisesti tulostaa.
// Tarvitset viittauksen kirjaan, jonka jälkeen kutsut
// Kirja-luokassa (toivottavasti) esiintyvää tulostuskomentoa
// voit käydä Vector-luokan läpi käyttämällä Enumeration:ia
for (Enumeration e = kaikkiKirjat.elements() ; e.hasMoreElements() ;) {
Kirja k = e.nextElement();
// tulostuskomento (onko tällaista ??)
k.tulosta();
}
} catch (Exception ex) {
}
}
/** Käynnistysmetodi luo uuden järjestämisohjelmaolion ja laittaa
sen käyntiin. Parameters: komentoriviparametrit - (ei käytössä) */
public static void main(String[] komentoriviparametrit) {
// luo uusi jarkkariolio
Jarjestamisohjelma jarkkariolio = new Jarjestamisohjelma();
// käynnistä aja-metodi
jarkkariolio.aja();
}
}
Jos vielä oot koneella :)
Tässä esimerkkiajo tehtävänannosta
Syötä kirjojen tietoja. Anna tyhjä kirjailijan nimi lopettaaksesi.
Anna kirjailijan nimi: Gao Xingjian
Anna kirjan nimi: Soul Mountain
Anna ilmestymisvuosi: 1997
Anna sivujen määrä: 528
Anna kirjailijan nimi: José Saramago
Anna kirjan nimi: Blindness
Anna ilmestymisvuosi: 1996
Anna sivujen määrä: 328
Anna kirjailijan nimi: Günter Grass
Anna kirjan nimi: The Tin Drum
Anna ilmestymisvuosi: 1959
Anna sivujen määrä: 804
Anna kirjailijan nimi: V. S. Naipaul
Anna kirjan nimi: Half a Life
Anna ilmestymisvuosi: 2001
Anna sivujen määrä: 211
Anna kirjailijan nimi:
Kirjat ilmestymisjärjestyksessä:
1. Günter Grass: "The Tin Drum", 1959. 804 sivua.
2. José Saramago: "Blindness", 1996. 328 sivua.
3. Gao Xingjian: "Soul Mountain", 1997. 528 sivua.
4. V. S. Naipaul: "Half a Life", 2001. 211 sivua.
-----------------------------------------
TÄHÄN LISÄTTY VAAN toString()- METODI
do {
tekijanNimi = lukija.lueMerkkijono("Anna kirjailijan nimi: ");
kirjanNimi = lukija.lueMerkkijono("Anna kirjan nimi: ");
ilmestymisvuosi = lukija.lueKokonaisluku("Anna ilmestymisvuosi: ");
sivujenMaara = lukija.lueKokonaisluku("Anna sivujen määrä: ");
Kirja kirjanTiedot = new Kirja(tekijanNimi, kirjanNimi, ilmestymisvuosi, sivujenMaara);
kirjanTiedot.toString(); //Lisäsin, jotta teksti pötköksi
kaikkiKirjat.add(kirjanTiedot);
} while (tekijanNimi.length() > 1);
--------------------------------------------
en ole kylläkään varma käyttääkö toi
kirjanTiedot.toString() nimenomaan juuri sitä
kirja-luokassa olevaa toString-metodia (vai yleistä).
----------------------------------------------
Tyokalupakki tkp = new Tyokalupakki();
// anna jarjesta-metodilleSyötteeksiKaikkiKirjat.
// HUOMHUOM: on epäselvää, huoliiko tuo jarjesta-// metodi Vectorin.
järjestämetodi on tällainen Tyokaulupakki.javassa:
public static void jarjesta(List lista)
Huoliiko se lista vektoria, yritän selvittää
jostain.
tkp.jarjesta(kaikkiKirjat);
// Kun järjestäminen on tehty, kirjat pitäisi ilmeisesti tulostaa.
// Tarvitset viittauksen kirjaan, jonka jälkeen kutsut
// Kirja-luokassa (toivottavasti) esiintyvää tulostuskomentoa
// tulostuskomento (onko tällaista ??)
Siellä Kirjaluokassa on konstruktori ja toString-metodi, muttei tulosta-metodia.
Jos Kirja-luokkaan on lisätty toString()-metodi, niin se tod.näk. tulosta tehtävänannossa pyydetyn rimpsun: "1. Günter Grass: "The Tin Drum", 1959. 804 sivua."
Tämän saa helposti selville näin:
System.out.println(kirjantiedot.toString());
Mutta jos tehtävänannossa kuvattua rimpsua ei tuolla synny, niin kyllä sen saa helposti muutenkin tuotettua. Se tosin edellyttää sitä, että Kirja-luokkaan (joka ei siis ilmeisesti ole sinun kirjoittamasi) on lisätty aksessorit tyyliin: getKirjanNimi, get Sivumaara jne.. Toinen vaihtoehto on, että Kirja-luokan muuttujat ovat julkisia, jolloin niihin voi viitata suoraan. Tämä on kuitenkin epätodennäköistä, silläpä luokkamuuttujien tulisi aina olla privaatteja.
List-luokasta vielä: JavaAPI:ssa ( http://java.sun.com/j2se/1.3/docs/api/java/util/List.html ) -sivun mukaan Vector-luokka implementoi List-luokkaa. Eli periaatteessa homman pitäisi toimia ihan ok..
// voit käydä Vector-luokan läpi käyttämällä Enumeration:ia
for (Enumeration e = kaikkiKirjat.elements() ; e.hasMoreElements(); ) {
Kirja k = e.nextElement();
System.out.print(k);
}
--------------------------------------------
Pitäisiköhän mun tulostaa k, vai kaikkiKirjat.
Lisäksi incompatible types probleema.
-------------------------------------------
kosh exercise_2 206 % javac Jarjestamisohjelma.java
Jarjestamisohjelma.java:60: incompatible types
found : java.lang.Object
required: Kirja
Kirja k = e.nextElement();
^
----------------------------------------------
Tästä eteenpäin koko ohjelma:
import java.util.*;
/**
Luokka Jarjestamisohjelma tarjoaa yksinkertaisen merkkipohjaisen
käyttöliittymän, jonka avulla voi kokeilla Tyokalupakki-luokan
järjestämismetodin toimintaa. Ohjelmalla järjestetään Kirja-olioita.*/
public class Jarjestamisohjelma extends Object {
private Nappiksenlukija lukija;
private String tiedotPotkoon;
private String kirjarivi;
private String tekijanNimi;
private int ilmestymisvuosi;
private int sivujenMaara;
private String kirjanNimi;
private Vector kaikkiKirjat = new Vector();
public Jarjestamisohjelma() {
this.lukija = lukija;
this.tekijanNimi = tekijanNimi;
this.kirjanNimi = kirjanNimi;
this.ilmestymisvuosi = ilmestymisvuosi;
this.sivujenMaara = sivujenMaara;
}
/** Ajaa järjestämisohjelman. Ohjelman käyttöliittymä kyselee
käyttäjältä järjestettävien kirjojen tiedot. Lopetus kun
syöttää tyhjän merkkijonon tekijanNimen kohdalle.
Tulostaa kirjat järjestyksessä. */
public void aja() {
try {
do {
tekijanNimi = lukija.lueMerkkijono("Anna kirjailijan nimi: ");
kirjanNimi = lukija.lueMerkkijono("Anna kirjan nimi: ");
ilmestymisvuosi = lukija.lueKokonaisluku("Anna ilmestymisvuosi: ");
sivujenMaara = lukija.lueKokonaisluku("Anna sivujen määrä: ");
Kirja kirjanTiedot = new Kirja(tekijanNimi, kirjanNimi,
ilmestymisvuosi, sivujenMaara);
kirjanTiedot.toString();
kaikkiKirjat.add(kirjanTiedot);
} while (tekijanNimi.length() > 1);
} catch (KelvottomatTeoksenTiedot pielessa) {
}
Tyokalupakki tkp = new Tyokalupakki();
tkp.jarjesta(kaikkiKirjat);
// voit käydä Vector-luokan läpi käyttämällä Enumeration:ia
for (Enumeration e = kaikkiKirjat.elements() ; e.hasMoreElements(); ) {
Kirja k = e.nextElement();
System.out.print(k);
}
}
/** Käynnistysmetodi luo uuden järjestämisohjelmaolion ja laittaa
sen käyntiin. Parameters: komentoriviparametrit - (ei käytössä) */
public static void main(String[] komentoriviparametrit) {
// luo uusi jarkkariolio
Jarjestamisohjelma jarkkariolio = new Jarjestamisohjelma();
// käynnistä aja-metodi
jarkkariolio.aja();
}
}
My mistake :) Incompatible type johtuu siitä, että Vector:ssa oleva elementti pitää typecastata erikseen.
Eli korvaa rivi:
Kirja k = e.nextElement();
tällä:
Kirja k = (Kirja) e.nextElement();
Typecast pitää tehdä aina, kun vektorista otetaan luokka "ulos".
Tulostamisesta:
Homman juju piilee siinä, että komennetaan Kirja-oliota "tulostamaan itsensä". Silloin siis
k.toString()
Toki kaikkiKirjat-vektorinkin voi tulostaa käyttämällä toString()-metodia. Mutta tällöin java ymmärtäisi komennon siten, että se käyttää Vector-luokassa olevan toString()-metodin toteutusta. Nyt emme halua sitä, vaan nimenomaan yksittäisen kirjan tulostuksen.
ohjelmaa ajettaessa tulee viel
NullPointer tekijanNimi-riville, outoa!
do {
tekijanNimi = lukija.lueMerkkijono("Anna kirjailijan nimi: ");
Kerro vielä jos keksit.. :)
-------------------------------------------
import java.util.*;
/**
Luokka Jarjestamisohjelma tarjoaa yksinkertaisen merkkipohjaisen
käyttöliittymän, jonka avulla voi kokeilla Tyokalupakki-luokan
järjestämismetodin toimintaa. Ohjelmalla järjestetään Kirja-olioita.*/
public class Jarjestamisohjelma extends Object {
private Nappiksenlukija lukija;
private String tiedotPotkoon;
private String kirjarivi;
private String tekijanNimi;
private int ilmestymisvuosi;
private int sivujenMaara;
private String kirjanNimi;
private Vector kaikkiKirjat = new Vector();
public Jarjestamisohjelma() {
this.lukija = lukija;
this.tekijanNimi = tekijanNimi;
this.kirjanNimi = kirjanNimi;
this.ilmestymisvuosi = ilmestymisvuosi;
this.sivujenMaara = sivujenMaara;
}
/** Ajaa järjestämisohjelman. Ohjelman käyttöliittymä kyselee
käyttäjältä järjestettävien kirjojen tiedot. Lopetus kun
syöttää tyhjän merkkijonon tekijanNimen kohdalle.
Tulostaa kirjat järjestyksessä. */
public void aja() {
try {
do {
tekijanNimi = lukija.lueMerkkijono("Anna kirjailijan nimi: ");
kirjanNimi = lukija.lueMerkkijono("Anna kirjan nimi: ");
ilmestymisvuosi = lukija.lueKokonaisluku("Anna ilmestymisvuosi: ");
sivujenMaara = lukija.lueKokonaisluku("Anna sivujen määrä: ");
Kirja kirjanTiedot = new Kirja(tekijanNimi, kirjanNimi,
ilmestymisvuosi, sivujenMaara);
kirjanTiedot.toString();
kaikkiKirjat.add(kirjanTiedot);
} while (tekijanNimi.length() > 1);
} catch (KelvottomatTeoksenTiedot pielessa) {
}
Tyokalupakki tkp = new Tyokalupakki();
tkp.jarjesta(kaikkiKirjat);
// voit käydä Vector-luokan läpi käyttämällä Enumeration:ia
for (Enumeration e = kaikkiKirjat.elements() ; e.hasMoreElements(); ) {
Kirja k = (Kirja) e.nextElement();
System.out.print( k.toString() );
}
}
/** Käynnistysmetodi luo uuden järjestämisohjelmaolion ja laittaa
sen käyntiin. Parameters: komentoriviparametrit - (ei käytössä) */
public static void main(String[] komentoriviparametrit) {
// luo uusi jarkkariolio
Jarjestamisohjelma jarkkariolio = new Jarjestamisohjelma();
// käynnistä aja-metodi
jarkkariolio.aja();
}
}
Missä kohtaa ohjelman ajoa tuo nullpointer tulee? Alussa vai lopussa?
Heti alussa
kosh exercise_2 229 % java Jarjestamisohjelma
java.lang.NullPointerException
at Jarjestamisohjelma.aja (Jarjestamisohjelma.java:36) (pc 7)
at Jarjestamisohjelma.main (Jarjestamisohjelma.java:73) (pc 9)
kosh exercise_2 230 %
Tällä hetkellä konstruktorissa on jostain syystä seuraavia rivejä:
public Jarjestamisohjelma() {
this.lukija = lukija;
this.tekijanNimi = tekijanNimi;
this.kirjanNimi = kirjanNimi;
this.ilmestymisvuosi = ilmestymisvuosi;
this.sivujenMaara = sivujenMaara;
}
Nuo rivit näyttävät mielestäni turhilta. Muutatko konstruktorin muotoon:
public Jarjestamisohjelma() {
}
Onko tällä vaikutusta?
Ei sillä näytä olevan vaikutusta.
Otin pois ne, ohjelma kääntyi, mutta
edelleen NullPointer.
Mut hyvä ehdotus kiitos :)
Usein mulla on ollu silmukoissa häikkää.
Ei se varmaankaan voi olla toi silmukan jatkamisehto (niinkun yleensä), kun se kääntäjä
väittää riviä 41, jossa on se tekijänNimi =..
No niinpä, eihän ohjelmassa ole instantioitu Lukija-luokkaa.. Eikä lukija.luoMerkkijono-metodia voi käyttää jos sitä ei ole vielä luotu.
Muuta rivi:
private Nappiksenlukija lukija;
Muotoon:
private Nappiksenlukija lukija = new Lukija();
*odottaa jännityksellä seuraavaa viestiä*
mutta ei vielä sieltä pois. Eli mun
} while (tekijanNimi.length() > 1);
ei lopeta kyselyä entteriin, vaikka pitäis.
Pitää keksiä siihen ehkä joku muu vaik
tekijanNimi.equals("")..?
Mä en ois ikinä keksiny sitä että lukija-oliosta
pitää tehä new lukijaolio, kiitos :)
Hyvä että homma menee eteenpäin.. Kohta meinaan pitää lähteä oluelle. Mutta jatketaan vielä.
While-testi menee pieleen todnäk sen takia, että enter-näppäimen painallus lähettää jonkinlaisen carriage return -merkin (hävettää kun ei ole tämän parempaa tietoa aiheesta, mutta en ole tehnyt merkkipohjaisia ohjelmia ikuisuuksiin).
Seuraava jippo saattaa toimia: Trimmaa käyttäjältä tullut syöte käyttämällä String-luokan trim-metodia. Samalla on hyvä testata se, ettei syöte saa 'null'-arvoa.
Eli muunna while-ehto seuraavaksi:
while (tekijanNimi != null && tekijanNimi.trim().length() > 0)
Kiitos kovasti kaikesta avusta. :)
Toimii!
Jotain pienen pientä viilaamista riittää
mulle vielä ehkä tunniksi. Sitten lopetan mäkin tältä päivältä.
En olisi ikinä saanut koodia kasaan! Pelastit mut kurssilta tippumiselta :)
tkk:lla on tosi vaikea saada apua ohjelmointi-probleemissa. Tälläkin javakurssilla on harjoitusryhmiä, joissa voi käydä kyselemässä assarilta apua, mutta ne on niin täynnä että saa viitata yli tunnin, jotta saa yhteen kysymykseen vastauksen (jos silloinkaan, kun ne ei saa muka kertoa liikaa).
Olen sitten yrittänyt kysellä ircissä ja tänään keksin keskusteluryhmät. Harvoin kukaan kuitenkaan viitsii vastailla mulle.
Miten voin korvata avun? :)
TKK:n ohjelmointikurssit on kyllä melkoisen tukalia - siitä samasta tehtaasta minäkin olen aikanaan sinnitellyt.. :)
Mutta ei kestä kiittää. Opettele riittävästi javaa, niin otan sinut firmaan töihin vuoden parin päästä :)
Mutta nyt hyvinansaitulle oluelle..