Gå til innhold

[LØST]en nullpointer jeg ikke skjønner bær av


Anbefalte innlegg

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 av ummairt
Lenke til kommentar
Videoannonse
Annonse

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
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

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
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 :D

 

 

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 av ummairt
Lenke til kommentar

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
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 av Freud
Lenke til kommentar
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 av ummairt
Lenke til kommentar

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
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
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

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 :thumbup:

Endret av ummairt
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...