Exception in thread "main" java.lang.NullPointerException

#1
Hallo, ich habe ein Javaprogramm erstellt, welches überwacht, ob die Anteile den Wert des Ganzen überschreiten. Eclipse zeigt mir keine Fehler an, doch wenn ich das ganze Starten will kommt in der Konsole die Meldung: "Exception in thread "main" java.lang.NullPointerException"

PHP:
public class Bruch {

    int zaehler;
    int nenner;
   
    Bruch() {
        zaehler = 0;
        nenner = 1;
    }
   
    Bruch(int x) {
        zaehler = x;
        nenner = 1;
    }
   
    Bruch(int x, int y) {
        zaehler = x;
        nenner = y;
    }
   
    Bruch(Bruch a) {
        this.zaehler = a.zaehler;
        this.nenner = a.nenner;
    }
   
    int getZaehler() {
        return zaehler;
    }
   
    int getNenner() {
        return nenner;
    }
   
    void setZaehler(int z) {
        zaehler = z;
    }
   
    void setNenner(int n) {
        nenner = n;
    }
   
    void ausgeben() {
        System.out.println(zaehler + "/" + nenner);
    }
   
    String bruchToString() {
        return zaehler + "/" + nenner;
    }
   
    void kuerzen() {
        int m, n, r;
        m = Math.abs(zaehler);
        n = Math.abs(nenner);
        r = m % n;
       
            while (r > 0) {
                m = n;
                n = r;
                r = m % n;
            }
        zaehler /= n;
        nenner /= n;
    }
   
    void gekuerztausgeben() {
        kuerzen();
        ausgeben();
    }
   
    boolean equals(Bruch x) {
        Bruch a = new Bruch(this.zaehler, this.nenner);
        Bruch b = new Bruch(x.zaehler, x.nenner);
        a.kuerzen();
        b.kuerzen();
        if ((a.zaehler == b.zaehler) && (a.nenner == b.nenner)) {
            return true;
        } else {
            return false;
        }
    }
   
    Bruch addiere(Bruch b) {
        Bruch x = new Bruch(this.zaehler, this.nenner);
        Bruch y = new Bruch(b.zaehler, b.nenner);
       
        x.kuerzen();
        y.kuerzen();
       
        Bruch c = new Bruch(x.zaehler + y.zaehler, x.nenner);
        return c;
       
    }
   
    Bruch subtrahiere(Bruch b) {
        Bruch x = new Bruch(this.zaehler, this.nenner);
        Bruch y = new Bruch(b.zaehler, b.nenner);
       
        x.kuerzen();
        y.kuerzen();
       
        Bruch c = new Bruch(this.zaehler - y.zaehler, x.nenner);
       
        return c;
    }
   
    double dezimalwert() {
        double a = this.zaehler;
        double b = this.nenner;
       
        return (a / b);
    }
   
   
   
   
}

public class Anteil extends Bruch {

   
    static Bruch verteilt;
   
    Anteil() {
        zaehler = 0;
        nenner = 1;
       
        Bruch b = new Bruch(zaehler, nenner);
       
        verteilt.addiere(b);
       
        if (verteilt.dezimalwert() > 1) {
            System.out.println("Der Anteil ist zu groß!");
        }
    }
   
    Anteil(int z, int n) {
        zaehler = z;
        nenner = n;
       
        Bruch b = new Bruch(z, n);
       
        verteilt.addiere(b);
       
        if (verteilt.dezimalwert() > 1) {
            System.out.println("Der Anteil ist zu groß!");
        }
       
    }
   
    double getVerteilt() {
        return (this.zaehler / this.nenner);
    }
   
   
    Bruch getRest() {
        Bruch a = new Bruch(1, 1);
        Bruch b = new Bruch(a.subtrahiere(verteilt));
        return b;
    }
   
   
   
   
}

public class Anteiltest {

    public static void main(String[] args) {
       
        int vermoegen = 200000;
       
        Anteil a1 = new Anteil(1, 4);
        Anteil a2 = new Anteil(1, 2);
       
        System.out.println("Anteil von a1: " + a1.bruchToString());
        System.out.println("Betrag von a1: " + vermoegen * a1.dezimalwert());
        System.out.println("Anteil von a2: " + a2.bruchToString());
        System.out.println("Betrag von a2: " + vermoegen * a2.dezimalwert());
        System.out.println("Verteilt: " + a1.verteilt.bruchToString());
        System.out.println("Rest: " + a1.getRest().bruchToString());
        System.out.println("Restbetrag: " + vermoegen * a1.getRest().dezimalwert());
       
       

    }

}
Würde mich über eure Hilfe sehr freuen.
 

cwriter

Erfahrenes Mitglied
#2
Hi

Zeile 129/140:
verteilt.addiere(b);

verteilt ist nicht initialisiert (Null), daher die NullPointerException.
Auf Zeile 121 sollte ein:
Java:
static Bruch verteilt = new Bruch();
das Problem beheben.

Nebenbei: Eclipse sollte dir doch eigentlich anzeigen, wo die Exception geworfen wurde?
Eclipse selbst kann dir nur Syntaxfehler anzeigen. Semantische Fehler kann der Computer (leider) nur schlecht bis gar nicht finden.

Gruss
cwriter
 

melmager

Erfahrenes Mitglied
#4
Ich werfe mal den Oberlehrer Modus an :)
(ist nicht böse gemeint aber ein paar Sachen sind mir so aufgefallen das ich was dazu sagen möchte )

Fangen wir mal mit der class Bruch an:
Wenn du setter und getter verwendest mache die bitte public und die entsprechenden variablen private

dann ist deine Funktion kuerzen() noch nicht fertig. Da fehlt einmal eine IF abfrage ob Nenner oder Zähler grösser ist.
Und dann deine var m und n setzen.
Dann musst du beim Rest auch aufhören wenn der Rest eine eins ist (Bruch nicht kürzbar).
Im Moment dürfte deine Funktion bei Brüchen die nicht gekürzt werden können in der schleife hängen bleiben und somit im
"silent run mode" sein :)

Code:
if (zaehler > nenner) {
//
} else {
//
}
while (r > 1) {
//
}
//wir haben was zum kuerzen
if (r == 0) {
 // hier nenner und zähler neu berechnen
}
dann solltes du auch dein bruchToString zu toString werden (Überschreiben der vorhandenen Function toString())
gleiches beim Vergleich - wobei die Frage auftaucht - sollen die Brüche sortierfähig sein ?

setnenner und setzehler würde ich rauswerfen und
Code:
public void setBruch(int neuzehler, int neunenner) {
}
draus machen
dann fehlt mir noch ne gegenfunction zum kuerzen()

Code:
// multipliziert nenner und zähler mit wert numnenner
public void erweitern(int mulnenner) {
}
dann frage ich mich was die classe Anteil soll - da habe ich keine spanneneden Sachen gesehen die nicht auch die Class Bruch kann. (ganz davon ab das Vererbung bedeutet die neue classe kann alles was auch die alte kann) - sprich der doppelte code kann und sollte raus.

Tendenziell würde ich entweder den Bruch erweitern um das Bruchrechen und die classe bruchrechnen nennen.
Oder eine reine classe Bruchrechnen erstellen deren functionen einen neuen Bruch rausgeben.
Code:
class Bruchrechnen extends Bruch {
// das Ergebnis setzt den derzeitigen Bruch neu
public void addiere(Bruch bruch) {
}
oder

Code:
class Bruchrechnen {

public Bruch addiere(Bruch a, Bruch b) {
}
Deine Rechenfunktionen stimmen so auch nicht :(
du bringst nicht die Nenner auf gleichen Wert wenn sie verschieden sind .....
im Moment ist 1/4 addiere 3/8 ergebnis 4/4 = 1/1
und 3/8 addiere 1/4 = 4/8 = 1/2

so Oberlehrer Modus aus - ich hoffe es hilft weiter
 
Zuletzt bearbeitet:

HonniCilest

Erfahrenes Mitglied
#5
Wenn wir schon beim Oberlehrer sind dann erwähne bitte auch das :D

Java:
if ((a.zaehler == b.zaehler) && (a.nenner == b.nenner)) {
    return true;
} else {
    return false;
}
Ist ein Einzeiler
Java:
return ((a.zaehler == b.zaehler) && (a.nenner == b.nenner));
 
#6
Der Code war größtenteils vorgegeben und ich sollte ihn lediglich erweitern, daher kann ich nicht viel dazu sagen. Ich möchte mich aber bei euch bedanken, ich werde das Ganze später noch einmal durchgehen
 

Neue Beiträge