Avatar billede sy22 Nybegynder
21. marts 2002 - 22:20 Der er 14 kommentarer og
1 løsning

NullPointerException

Hej Folk, jeg får desværre en nullpointerexception, når jeg fra min knapfunktion kalder en metode fra en anden klasse selvom jeg har oprettet objekt.

Det er gL.sFEPL metoden der giver problemer!

her er som følger:
1-min director klasse der kalder
2-superklassen til "funktionsklassen"
3-subklassen med de pågældende funktioner

1:
import aLibrary.*;
import java.awt.*;
/**
* directorklasse, det laver 3bw og indeholder metoder til at udregne indhold
* af raavarer og samlet energiindhold, samt udskrive opskrift.
* @author (simon_frans)
* @version (1.0)
*/
public class Director extends A3ButtonHandler
{
    private A3ButtonWindow a3bw;
    private AView av;
    private ATextArea txt2, txt3;
    private ALabel label1, label2, label3;
    Kartofler kT;
    Loeg lG;
    Smoer sM;
    Ost oS;
    Guleroedder gR;
    OkseKoed oK;
    LasagnePlader lP;
    Mel mL;
    Tomat tM;
    Maelk mK;
    GrundLasagne gL;
    BechSauce bS;
    Boef bF;
    RaastKart rK;


    public Director(){
        a3bw = new A3ButtonWindow(this);
        //av = new AView(0,0,600,400);
        label1 = new ALabel(5,350,300,150);
        label2 = new ALabel(15,170,250,150);
        label3 = new ALabel(300,170,290,150);
        txt2 = new ATextArea(20,50,250,150);
        txt3 = new ATextArea(320,50,250,150);
        label1.place(a3bw);
        label2.place(a3bw);
        label3.place(a3bw);
        txt2.place(a3bw);
        txt3.place(a3bw);
        a3bw.repaint();
        //av.place(a3bw);
        label1.setFontSize(16);
        label2.setFontSize(14);
        label3.setFontSize(14);
        txt2.setFontSize(12);
        txt3.setFontSize(12);
        a3bw.setColor(Color.orange);
        label1.setColor(Color.blue);
        label1.setText("Lasagne");
        label2.setText("Brug mid knap for opskrift");
        label3.setText("Brug right knap for energiprocenter");
        a3bw.repaint();
        kT = new Kartofler();
        lG = new Loeg();
        sM = new Smoer();
        oS = new Ost();
        gR = new Guleroedder();
        oK = new OkseKoed();
        lP = new LasagnePlader();
        mL = new Mel();
        tM = new Tomat();
        mK = new Maelk();
        gL = new GrundLasagne();
        bS = new BechSauce();
        bF = new Boef();
        rK = new RaastKart();
        a3bw.repaint();
    }


    public void leftAction(){

        if (label1.getText().equals("Lasagne")){  //label1.getText().equals( "lasagne" )
            label1.setText("Boef med Raastegte Kartofler");
        }else{
            label1.setText("Lasagne");
        a3bw.repaint();
    }
}
    public void midAction(){
        if (label1.getText().equals("Lasagne")){
            txt2.appendln("Lav dig selv en lækker lasagne"+"\n"+"med de tilgængelige råvarer,"+"\n"+"bestående af grundlasagne"+"\n"+"og bechamelsauce!\n");
            //txt2.appendln("LASAGNEOPSKRIFT"+gL.getOkseMaengde()+"gr. oksekoed");
            //Samme for resten af ingridienser samt fremgangsmaade som string
        }else{
            txt2.appendln("Form og steg dig en stor bøf"+"\n"+"mens dine kartofler steges"+"\n"+"i ovnen"+"\n"+"- bør nydes med en kold øl!\n");
            //txt2.appendln("BOEF MED RAASTEGTE KARTOFLER"+bF.getOkseMaengde()+"gr. oksekoed");
            //Samme for resten af ingridienser samt fremgangsmaade som string
            a3bw.repaint();
            txt2.repaint();
  }
}
    public void rightAction(){
        if (label1.getText().equals("Lasagne")){
          txt3.appendln("Fedtenergiprocent er " + gL.sFEPL());
            //samme for protein og kulhydrat
        }else{
          txt3.appendln("Fedtenergiprocent er " + bF.sFEPB());
            //samme for protein og kulhydrat
        }
    }     
}


2:

/**
* Opskrift Superklasse, indeholder alle opskriftattributter
*
* @author (simon_frans)
* @version (1.0)
*/
public class Opskrifter
{
        protected int okseMaengde;
        protected int kartMaengde;
        protected int loegMaengde;
        protected int smoerMaengde;
        protected int ostMaengde;
        protected int guleMaengde;
        protected int lagsPlMaengde;
        protected int melMaengde;
        protected int maelkMaengde;
        protected int tomatMaengde;
        protected Kartofler kT;
        protected Loeg lG;
        protected Smoer sM;
        protected Ost oS;
        protected Guleroedder gR;
        protected OkseKoed oK;
        protected LasagnePlader lP;
        protected Mel mL;
        protected Tomat tM;
        protected Maelk mK;
        protected GrundLasagne gL;
        protected BechSauce bS;
        protected Boef bF;
        protected RaastKart rK;


}



3:


/**
* specifik grundlasagneopskrift med raavare værdier
*
* @author (simon_frans)
* @version (1.0)
*/
public class GrundLasagne extends Opskrifter
{
    public GrundLasagne(){
        okseMaengde=500;
        kartMaengde=0;
        loegMaengde=300;
        smoerMaengde=0;
        ostMaengde=200;
        guleMaengde=200;
        lagsPlMaengde=250;
        melMaengde=0;
        maelkMaengde=200;
        tomatMaengde=300;
    }
    public int getOkseMaengde(){
        return okseMaengde;
    }
    public int getKartMaengde(){
        return kartMaengde;
    }
    public int getLoegMaengde(){
        return loegMaengde;
    }
    public int getSmoerMaengde(){
        return smoerMaengde;
    }
    public int getOstMaengde(){
        return ostMaengde;
    }
    public int getGuleMaengde(){
        return guleMaengde;
    }
    public int getLagsPlMaengde(){
        return lagsPlMaengde;
    }
    public int getMelMaengde(){
        return melMaengde;
    }
    public int getMaelkMaengde(){
        return maelkMaengde;
    }
    public int getTomatMaengde(){
        return tomatMaengde;
    }
    public double samletFedt(){
        return (okseMaengde*oK.getFedt())+(kartMaengde*kT.getFedt())+(loegMaengde*lG.getFedt())+(smoerMaengde*sM.getFedt())+(ostMaengde*oS.getFedt())+(guleMaengde*gR.getFedt())+(lagsPlMaengde*lP.getFedt())+(melMaengde*mL.getFedt())+(maelkMaengde*mK.getFedt())+(tomatMaengde*tM.getFedt());
//SE HER!!! LAV OBJEKT OK = NEW, LAVES I DIRECTOR FOR AT KALDE METODE, HUSK DOUBLE OG RETURN
    }
    public double samletProtein(){
        return (okseMaengde*oK.getProtein())+(kartMaengde*kT.getProtein())+(loegMaengde*lG.getProtein())+(smoerMaengde*sM.getProtein())+(ostMaengde*oS.getProtein())+(guleMaengde*gR.getProtein())+(lagsPlMaengde*lP.getProtein())+(melMaengde*mL.getProtein())+(maelkMaengde*mK.getProtein())+(tomatMaengde*tM.getProtein());                                                   
    }
    public double samletKulhydrat(){
        return (okseMaengde*oK.getKulhydrat())+(kartMaengde*kT.getKulhydrat())+(loegMaengde*lG.getKulhydrat())+(smoerMaengde*sM.getKulhydrat())+(ostMaengde*oS.getKulhydrat())+(guleMaengde*gR.getKulhydrat())+(lagsPlMaengde*lP.getKulhydrat())+(melMaengde*mL.getKulhydrat())+(maelkMaengde*mK.getKulhydrat())+(tomatMaengde*tM.getKulhydrat());
    }
    public double samletKj(){
        return (okseMaengde*oK.getKj())+(kartMaengde*kT.getKj())+(loegMaengde*lG.getKj())+(smoerMaengde*sM.getKj())+(ostMaengde*oS.getKj())+(guleMaengde*gR.getKj())+(lagsPlMaengde*lP.getKj())+(melMaengde*mL.getKj())+(maelkMaengde*mK.getKj())+(tomatMaengde*tM.getKj());
    }
    public double fedtEnergiProcent(){
        return (samletFedt()*37*100)/samletKj();
    }
    public double proteinEnergiProcent(){
        return (samletProtein()*17*100)/samletKj();
    }
    public double kulhydratEnergiProcent(){
        return (samletKulhydrat()*17*100)/samletKj();
    }
    public double sFEPL(){
        return (fedtEnergiProcent()+bS.fedtEnergiProcent());
    }
Avatar billede disky Nybegynder
21. marts 2002 - 22:21 #1
hvor opstår den nullpointerexception
Avatar billede sy22 Nybegynder
21. marts 2002 - 22:24 #2
jeg kompilerer uden fejl, men når jeg kører mit program og  prøver at kalde gL.sFEPL, får jeg meddelelsen i cmd
Avatar billede jakoba Nybegynder
21. marts 2002 - 22:39 #3
kommer der ikke en stak-trace?
Avatar billede greybeard Nybegynder
21. marts 2002 - 22:50 #4
bS er erklæret i superklassen, men den findes også i Director klassen. Det ere den i Director klassen, du instantierer og ikke den i Opskrifter, som derfor er null.
Derefter kalder du Lasagne, som forsøger at kalde en metode på sin egen bS, der jo er null.
Avatar billede greybeard Nybegynder
21. marts 2002 - 22:54 #5
Har du ikke en superklasse for din råvarer, som du kan sende som parameter til metoderne i Lasagne klassen

    public double sFEPL( raaVarer rV){
        return (fedtEnergiProcent()+rV.fedtEnergiProcent());
    }
Avatar billede sy22 Nybegynder
21. marts 2002 - 23:08 #6
Jeg kom altså til at give dig pointene lidt for hurtigt...vil du ikke være sød at uddybe dit svar lidt mere...mener du at jeg også skat instantiere i superklassen?

Tak
Avatar billede sy22 Nybegynder
21. marts 2002 - 23:12 #7
jeg har get metoder til alle parametre i råvare klasserne
Avatar billede jakoba Nybegynder
21. marts 2002 - 23:18 #8
GrundLasagne extends Opskrifter
det betyder at klassen GrundLasagne arver alle de variable der er defineret i Opskriter herunder også:
        protected BechSauce bS;
så når metoden sFELP() spørger til
                bS.fedtEnergiProcent());
er det den variabel den prøver at kikke i og den er ikke blevet instantieret med noget.
Avatar billede sy22 Nybegynder
21. marts 2002 - 23:27 #9
ja så langt er jeg med, nu har jeg instantieret den i Opskrifter, og fjernet inst. i director klassen, men det kører stidig ikke, men nu henviser null til rightAction metoden i directorklassen, istedet for til gL.sFEPL metoden i Lasagneklassen...
Avatar billede greybeard Nybegynder
21. marts 2002 - 23:29 #10
Så vidt jag kan se, bruger du overhovedet ikke dine raavarer i Director.
Det er i opskrifter, du har brug for dem.
Da det ser ud til at være konstante værdier, hvorfor så ikke instantiere dem i superklassen opskrifter, og kun der. Så er de altid til rådighed.
Avatar billede greybeard Nybegynder
21. marts 2002 - 23:30 #11
Har du også flyttet instantieringen af GrundLasagne.
Den skal blive, da den jo ikke er råvare, men en opskrift.
Avatar billede jakoba Nybegynder
21. marts 2002 - 23:36 #12
jeps. for den har brug for en instantieret
    GrundLasagne gL;
som DEN kan se.

Hvis du vil have metoder i klasserne til at kikke på objekter der bor i en anden klasse må du enten adressere dig hen til dem (og de skal iike være pivate eller protected), eller også sende objektet med som parameter til den metode der skal kikke i det.

Det er det sidste greybeard foreslår med en superklasse som alle råvarerne extender sig fra der så kan bruges som parametertype i fx metoden sFEPL()

mvh JakobA
Avatar billede sy22 Nybegynder
21. marts 2002 - 23:50 #13
Ok det vil sige:
jeg flytter inst. og erklæring af råvarer og opskrifter til opskriftssuperklassen;
så det eneste jeg skal gøre i director er at erklære GrundLasagne gL;
Avatar billede sy22 Nybegynder
21. marts 2002 - 23:54 #14
Jeg vil også gerne sige tak for hjælpen til jer alle, i er fede.
Det er første gang jeg har benyttet mig af eksperten...men helt sikkert ikke sidste!
Avatar billede greybeard Nybegynder
22. marts 2002 - 00:02 #15
Tak selv:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester