ummairt Skrevet 29. april 2007 Del Skrevet 29. april 2007 (endret) Hei, Prøvd å løse en nullpointer exception i noen halvtimer nå ... Men uten noe hell Selv om jeg sjekker med to arrayer , en på lengde 6 og en på 32 om noe er NULL der ( mao prøver å ikke få med NULL verdiene) så får jeg nullpointer exception... Her er koden double gjRegn(int i) { for ( int j = 0; j<31; j++){ //på dene linja kommer nullpointer// if(mdata[i].dagdata[j]!=null){ System.out.println("dette har jo funket"); }else{ System.out.println("dette funket ikke");} } return 0; } Endret 2. mai 2007 av ummairt Lenke til kommentar
Patton Skrevet 29. april 2007 Del Skrevet 29. april 2007 Har du instansiert mdata-arrayet og/eller dagdata-arrayet? Altsaa, hvis du skal vaere 100% sikker paa aa ikke faa nullpointerexception, maa foelgendes sjekkes: (mdata != null) && (mdata[i] != null) && (mdata[i].dagdata != null) && (mdata[i].dagdata[j] != null) Lenke til kommentar
ummairt Skrevet 29. april 2007 Forfatter Del Skrevet 29. april 2007 Har du instansiert mdata-arrayet og/eller dagdata-arrayet? Altsaa, hvis du skal vaere 100% sikker paa aa ikke faa nullpointerexception, maa foelgendes sjekkes: (mdata != null) && (mdata[i] != null) && (mdata[i].dagdata != null) && (mdata[i].dagdata[j] != null) 8495938[/snapback] Tror jeg har funnet problemet. Det er vel hovedtingen som egentlig ikke blir utført. Da det er sagt betyr det ikke at jeg har klart å løse problemet:( Det er nemlig slik at jeg ikke får lagt inn månedene ordentlig... Jeg leser inn dag,maxvind, nedbør, mintemp, maxtemp og sjekker først om det er null. Hvis ja så lager jeg et nytt maanedsobjekt... Klikk for å se/fjerne innholdet nedenfor if(st.mdata[mnd-1]==null){st.mdata[mnd-1]=new Maanedsdata(dag,maxvind, nedbør, mintemp, maxtemp);} //lenger ned i klassen Maanedsdata sin konstruktør så lager jeg et nytt objekt av klassen Dagdata Maanedsdata(int dag,double maxvind, double nedbør,double mintemp, double maxtemp){ dagdata[dag-1]= new Dagdata(maxvind, nedbør, mintemp, maxtemp); } Hvis det ikke er null , da kan jeg jo sende alt direkte til Dagdata..... Klikk for å se/fjerne innholdet nedenfor else if (st.mdata[mnd-1].dagdata!=null){st.mdata[mnd-1].dagdata[dag-1]=new Dagdata(maxvind, nedbør, mintemp, maxtemp);} Men jeg får fortsatt nullpointer ... noe er mere enn gæærnt... Lenke til kommentar
Cotul Skrevet 29. april 2007 Del Skrevet 29. april 2007 Hmm, minner veldig om en oblig fra UiO. Hvordan legger du inn data i de andre dagene? Maanedsdata(int dag,double maxvind, double nedbør,double mintemp, double maxtemp){ dagdata[dag-1]= new Dagdata(maxvind, nedbør, mintemp, maxtemp); Hvis jeg forstår det rett så blir den der kun kjørt en gang i konstruktøren til måned. og da bare for første dagen hver måned? Du leser data fra fil ja? Da kan du jo første legge dataene inn i en dagdata[] og deretter sende arrayen til måneden. Lenke til kommentar
ummairt Skrevet 29. april 2007 Forfatter Del Skrevet 29. april 2007 (endret) Hmm, minner veldig om en oblig fra UiO. Hvordan legger du inn data i de andre dagene? Maanedsdata(int dag,double maxvind, double nedbør,double mintemp, double maxtemp){ dagdata[dag-1]= new Dagdata(maxvind, nedbør, mintemp, maxtemp); Hvis jeg forstår det rett så blir den der kun kjørt en gang i konstruktøren til måned. og da bare for første dagen hver måned? Du leser data fra fil ja? Da kan du jo første legge dataene inn i en dagdata[] og deretter sende arrayen til måneden. 8497202[/snapback] Du har rett, dette er oblig4 fra UiO, har løst den forrige semester med massevis av hjelp... Denne gangen prøvde jeg sjøl og hang litt mindre men til slutt like mye fast igjen Jeg prøver jo å legge dataene inn i dagdata hvis mdata[mnd-1]!=null; else if (st.mdata[mnd-1].dagdata!=null){st.mdata[mnd-1].dagdata[dag-1]=new Dagdata(maxvind, nedbør, mintemp, maxtemp);} Det skal bli lagt inn informasjon for 6 måneder med dems respektive dager.. fra klassen stasjon så har jeg en array med lengde 6, og i klassen maaned så har jeg en array med lengde 31.. Maanedsdata[] mdata = new Maanedsdata[6]; Dagdata[] dagdata = new Dagdata[31]; Endret 29. april 2007 av ummairt Lenke til kommentar
ummairt Skrevet 29. april 2007 Forfatter Del Skrevet 29. april 2007 Det ser ut som programmet ikke kommer inn i noen av disse if løkkenen:s Klikk for å se/fjerne innholdet nedenfor if(stasjonFraNavn.containsKey(stNr)||stasjonFraNavn.containsKey(stNr)){ Stasjon st = stasjonFraNr.get(stNr); if(st.mdata[mnd-1]!=null){st.mdata[mnd-1]=new Maanedsdata(dag,maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn setning 1");} else if (st.mdata[mnd-1].dagdata==null){st.mdata[mnd-1].dagdata[dag-1]=new Dagdata(maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn i setning 2");} } } }else System.out.println("Filen " +fnavn+ " ble ikke funnet"); } Lenke til kommentar
Cotul Skrevet 29. april 2007 Del Skrevet 29. april 2007 (endret) if(st.mdata[mnd-1]!=null){ st.mdata[mnd-1]=new Maanedsdata(dag,maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn setning 1");} else if (st.mdata[mnd-1].dagdata==null){ st.mdata[mnd-1].dagdata[dag-1]=new Dagdata(maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn i setning 2");} vel, hvis st.mdata[mnd-1] == null hva skjer da? for st.mdata[mnd-1].dagdata[dag-1]=new Dagdata(maxvind, nedbør, mintemp, maxtemp); vil vel funkte dårlig da ettersom st.mdata == null er det ingen plass å legge dagdata i. kan hende det er noe jeg ikke ser da. Kunne du ha lagt ut hele koden? kan bli enklere å se da. edit: men den skulle muligens ha skrevet ut system.out.println der ja. Eller får du nullpointer exception før det ? Endret 29. april 2007 av Freud Lenke til kommentar
ummairt Skrevet 29. april 2007 Forfatter Del Skrevet 29. april 2007 (endret) if(st.mdata[mnd-1]!=null){ st.mdata[mnd-1]=new Maanedsdata(dag,maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn setning 1");} else if (st.mdata[mnd-1].dagdata==null){ st.mdata[mnd-1].dagdata[dag-1]=new Dagdata(maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn i setning 2");} vel, hvis st.mdata[mnd-1] == null hva skjer da? for st.mdata[mnd-1].dagdata[dag-1]=new Dagdata(maxvind, nedbør, mintemp, maxtemp); vil vel funkte dårlig da ettersom st.mdata == null er det ingen plass å legge dagdata i. kan hende det er noe jeg ikke ser da. Kunne du ha lagt ut hele koden? kan bli enklere å se da. edit: men den skulle muligens ha skrevet ut system.out.println der ja. Eller får du nullpointer exception før det ? 8499931[/snapback] Her er koden ..Jeg mistenker at problemet ligger i metoden lesFraFil, hvor jeg først leser alle data fra fil , men da jeg skal sende data til array så går den ikke inn i noen av IF setningene.... Klikk for å se/fjerne innholdet nedenfor her er den foreløbige koden import easyIO.*; import java.util.*; import java.io.*; class Oblig4 { public static void main (String[] args) { String s1 = "filStasjon.txt"; String s2 = "Vaerdata-1.txt"; if (args.length >= 2) { s1 = args[0]; s2 = args[1]; } VaerAnalyse va = new VaerAnalyse(s1, s2); va.ordreløkke(); } } class VaerAnalyse { HashMap <String, Stasjon> stasjonFraNavn = new HashMap <String, Stasjon> (); HashMap <String, Stasjon> stasjonFraNr = new HashMap <String, Stasjon> (); Stasjon st; In tast = new In(); Out skjerm = new Out(); VaerAnalyse(String stasjonsfilnavn, String vaerfilnavn) { lesStasjonerFraFil(stasjonsfilnavn); lesVaerDataFraFil(vaerfilnavn); } void lesStasjonerFraFil(String fnavn) { if (new File (fnavn).exists()){ In filStasjon = new In(fnavn); while(!filStasjon.lastItem()){ String stNr= filStasjon.inWord(); String stNavn= filStasjon.inWord(); int stHøyde = filStasjon.inInt(); String stKommune = filStasjon.inWord(); String stFylke = filStasjon.inWord(); st = new Stasjon(stNr,stNavn, stHøyde, stKommune, stFylke); stasjonFraNavn.put(stNavn, st); stasjonFraNr.put(stNavn, st); } }else System.out.println("Filen " + fnavn +" ble ikke funnet"); } void lesVaerDataFraFil(String fnavn) { if(new File (fnavn).exists()){ In filVaer = new In(fnavn); while (!filVaer.endOfFile()){ String stNr = filVaer.inWord(); filVaer.skipWhite(); int dag = filVaer.inInt(); filVaer.skipWhite(); int mnd = filVaer.inInt(); filVaer.skipWhite(); double nedbør = filVaer.inDouble(); filVaer.skipWhite(); double maxvind =filVaer.inDouble(); filVaer.skipWhite(); double mintemp = filVaer.inDouble(); filVaer.skipWhite(); double maxtemp = filVaer.inDouble(); filVaer.skipWhite(); if(stasjonFraNavn.containsKey(stNr)||stasjonFraNavn.containsKey(stNr)){ Stasjon st = stasjonFraNr.get(stNr); if(st.mdata[mnd-1]!=null){st.mdata[mnd-1]=new Maanedsdata(dag,maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn setning 1");} else if (st.mdata[mnd-1].dagdata==null){st.mdata[mnd-1].dagdata[dag-1]=new Dagdata(maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn i setning 2");} } } }else System.out.println("Filen " +fnavn+ " ble ikke funnet"); } void lagStasjonsliste() { int i = 0; String [] sortering = new String[stasjonFraNavn.size()]; Iterator <String> it = stasjonFraNavn.keySet().iterator(); while(it.hasNext()){ String nøkkel = it.next(); sortering[i++]=nøkkel; } Arrays.sort(sortering); for (int j =0; j<stasjonFraNavn.size(); j++){ Stasjon liste = (Stasjon) stasjonFraNavn.get(sortering[j]); skjerm.out(liste.stNavn, 19, Out.CENTER); skjerm.out(liste.stNr, 20, Out.LEFT); skjerm.out(liste.høyde, 7, Out.CENTER); skjerm.out(liste.stKommune, 15, Out.CENTER); skjerm.outln(liste.stFylke, 15, Out.CENTER); } } void lagStasjonslisteFylke() { boolean fant = false; skjerm.outln("Hvilken fylke"); String fylke = tast.inLine().toUpperCase(); Iterator it = stasjonFraNavn.values().iterator(); while(it.hasNext()){ Stasjon st = (Stasjon) it.next(); if(fylke.equals(st.stFylke)){ skjerm.out(st.stNavn, 19, Out.CENTER); skjerm.out(st.stNr,20, Out.CENTER); skjerm.out(st.stKommune,7, Out.CENTER); skjerm.outln(st.høyde, 15, Out.CENTER); fant = true; } } if(!fant) {skjerm.outln("Feil fylkenavn"); tast.readLine();} } void lagMaanedsoversikt() { Stasjon st = null; boolean fant = false ; skjerm.out("Tast inn stasjonsnavn eller stasjonsnr:\t"); String navnNummer = tast.inLine().toUpperCase(); if(stasjonFraNavn.containsKey(navnNummer)){ st=(Stasjon) stasjonFraNavn.get(navnNummer); fant= true; } else if (stasjonFraNr.containsKey(navnNummer)){ st = (Stasjon) stasjonFraNr.get(navnNummer); fant = true; } else { skjerm.outln(navnNummer +"finnes ikke"); ordreløkke(); } if(fant) skjerm.out("Hvilken måned ønsker du oversikt for (1-6):\t"); int måned = tast.inInt(); st.gjRegn(måned-1); }//lagMaanedsoversikt void finnAntUvaersdager() {} void finnRegnKystInnland() {} void sammenlignNordVest() {} void ordreløkke() { int valg = 0; while(valg !=7){ System.out.println("\n\n Velkommen Til Norges Meterologiske Institutt"); System.out.println(); System.out.println("De har følgende valg"); System.out.println("_______________________________________________"); System.out.println("| 1 | < Lag liste over alle stasjoner "); System.out.println("| 2 | < Lag Liste over stasjoner for fylke "); System.out.println("| 3 | < Lag maanedsoversikt "); System.out.println("| 4 | < Oversikt over Uværsdager "); System.out.println("| 5 | < Finn nedbør kyst & Innland "); System.out.println("| 6 | < Sammenlikn Regn Nord & Vest "); System.out.println("| 7 | < AVSLUTT "); System.out.println("_______________________________________________"); System.out.print("Venneligst tast inn et valg:\t"); valg = tast.inInt(); switch(valg){ case 1: lagStasjonsliste(); break; case 2: lagStasjonslisteFylke(); break; case 3: lagMaanedsoversikt(); break; } } } } class Dagdata { double maxvind, nedbør, mintemp, maxtemp; Dagdata(double maxvind, double nedbør, double mintemp, double maxtemp){ this.maxvind = maxvind; this.nedbør= nedbør; this.mintemp = mintemp; this.maxtemp=maxtemp; } } class Maanedsdata {// Seks objekter for hver stasjon Dagdata[] dagdata = new Dagdata[31]; Maanedsdata(int dag,double maxvind, double nedbør,double mintemp, double maxtemp){ System.out.println(dag); dagdata[dag-1]= new Dagdata(maxvind, nedbør, mintemp, maxtemp); } } class Stasjon { // Ett objekt for hver stasjon Maanedsdata[] mdata = new Maanedsdata[6]; String stNr, stNavn, stKommune, stFylke; int høyde; Stasjon(String stNr, String stNavn, int høyde, String stKommune, String stFylke){ this.stNr = stNr; this.stNavn= stNavn; this.høyde = høyde; this.stKommune = stKommune; this.stFylke =stFylke; } String navn () { return this.stNavn; } double gjRegn(int i) { double nedbør = 0; int antall=0; for ( int j = 0; j<mdata.length; j++){ if(mdata==null){System.out.println("lkjfkljsl");} antall++; } System.out.println(antall); return nedbør; } }//Stasjon Endret 29. april 2007 av ummairt Lenke til kommentar
Cotul Skrevet 30. april 2007 Del Skrevet 30. april 2007 Har ikke så mye tid i dag men en ting: I void lesStasjonerFraFil(String fnavn) stasjonFraNavn.put(stNavn, st); stasjonFraNr.put(stNavn, st); burde kanskje stå: stasjonFraNavn.put(stNavn, st); stasjonFraNr.put(stNr, st); tror dette burde fikse et par ting, for i void lesVaerDataFraFil(String fnavn) så tester du for stNr. Lenke til kommentar
mFaFa Skrevet 30. april 2007 Del Skrevet 30. april 2007 Hei, Prøvd å løse en nullpointer exception i noen halvtimer nå ... Men uten noe hell Selv om jeg sjekker med to arrayer , en på lengde 6 og en på 32 om noe er NULL der ( mao prøver å ikke få med NULL verdiene) så får jeg nullpointer exception... Her er koden double gjRegn(int i) { for ( int j = 0; j<31; j++){ //på dene linja kommer nullpointer// if(mdata[i].dagdata[j]!=null){ System.out.println("dette har jo funket"); }else{ System.out.println("dette funket ikke");} } return 0; } 8495854[/snapback] For det første går den løkka bare 31 ganger... 0 til < 31 betyr at den stopper ved 30, og 0 opp til og med 30 er 31 ganger. Du skriver at lengden er 32, men 31 er nok riktig ettersom du vil representere dager i mnd. Se hvilken linje NullPointerException oppstår, og feilsøk etter den ved å legge inn System.out.println(objektpeker) på strategiske plasser i programmet ditt. Lenke til kommentar
mFaFa Skrevet 1. mai 2007 Del Skrevet 1. mai 2007 Det ser ut som programmet ikke kommer inn i noen av disse if løkkenen:s Klikk for å se/fjerne innholdet nedenfor if(stasjonFraNavn.containsKey(stNr)||stasjonFraNavn.containsKey(stNr)){ Stasjon st = stasjonFraNr.get(stNr); if(st.mdata[mnd-1]!=null){st.mdata[mnd-1]=new Maanedsdata(dag,maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn setning 1");} else if (st.mdata[mnd-1].dagdata==null){st.mdata[mnd-1].dagdata[dag-1]=new Dagdata(maxvind, nedbør, mintemp, maxtemp); System.out.println("gikk inn i setning 2");} } } }else System.out.println("Filen " +fnavn+ " ble ikke funnet"); } 8498258[/snapback] Ser ikke ut som du har forstått hvordan else fungerer. Det er umulig at programmet ditt skriver ut setning 1 og 2 etter hverandre. Programmet går kun inn i else-grenen hvis if(st.mdata[mnd-1]!=null) ble false. Hvis denne testen skal virke etter hensikten din fjerner du else og putter den andre if-testen inni klammene til den første. Lenke til kommentar
ummairt Skrevet 1. mai 2007 Forfatter Del Skrevet 1. mai 2007 (endret) Har nå løst begge problemene , Jeg fikk programmet til å gå inn i den første if setningen , men ikke i den andre fordi at jeg ikke sjekka for dagdata[dag-1] ( skrev heller dagdata[dag], som forhindra programmet i å gå inn i denne testen.... Men bruker og mafa , takk for all hjelpa Endret 2. mai 2007 av ummairt Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå