Methoden Fehler in einfachem Java Programm.

  • Themenstarter Themenstarter Gelöschtes Mitglied 45192
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 45192

Gast
(Methoden) Fehler in einfachem Java Programm.

Sehr geehrte Community,
Ich habe vor kurze mit der Java Programmierung begonnen
und mir ein Grundlagenbuch gekauft. :rtfm:
Mithilfe dieses Buches habe ich mehrere einfache Programme pogrammiert.

In diesem Programm befinden sich ein Fehler der vom Editor nicht angezeigt wierd. :noe: ;(
Es erscheint nur eine, für mich unverständliche Fehlermeldung:

Code:
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at VerkettenVonKonstruktoren.Bruch3.<init>(Bruch3.java:19)
	at VerkettenVonKonstruktoren.Bruch3.<init>(Bruch3.java:31)
	at VerkettenVonKonstruktoren.VerkettenVonKonstruktoren.main(VerkettenVonKonstruktoren.java:6)

Das Programm besteht aus zwei Klassen.
Es erstellt zwei Objekte (Zähler und Nenner).
Ihnen wierd automatisch beim erstellen durch Konstruktoren mit Parametern Werte zugewiesen,
die automatisch gekürzt (falls sie gekürtzt werden können) wierd.
Wenn der Nenner 0 ist wierd eine Fehlermeldung ausgegeben.
Am Ende wierd das Ergebniss (durch eine Methode) ausgegeben.
Wo habe ich einen fehler gemacht?

Hier ist das ausführende Programm:


Java:
package VerkettenVonKonstruktoren;

public class VerkettenVonKonstruktoren {

    public static void main(String[] args) {
	Bruch3 a = new Bruch3();
	System.out.print("Standartwerte: ");
	a.ausgeben();
    }

}

Hier ist die zweite Klasse (Klasse Bruch 3):

Java:
package VerkettenVonKonstruktoren;

class Bruch3 {
    int zaehler;
    int nenner;

    Bruch3(int z, int n) {
	int hz;
	int hn;
	int r;
	hz = 0;
	hn = 0;
	r = 0;
	if (n == 0) {
	    System.out.print("Fehler! Der Nenner darf nicht 0 sein!");
	} else {
	    hz = hn;
	    hn = r;
	    r = hz % hn;
	    while (r > 0) {
		hz = hn;
		hn = r;
		r = hz % hn;
	    }
	    zaehler = z / hn;
	    nenner = n / hn;
	}
    }

    Bruch3() {
	this(0, 1);
    }

    Bruch3(int n) {
	this(n, 1);
    }

    void ausgeben() {
	System.out.print(this.zaehler + "/" + nenner);
    }
}

Wen ihr den (oder die) Fehler gefunden habt wäre es nett wen ihr mir Helft. :applaus:

Außerdem habe ich noch Fragen zu den Zeilen 30 bis 36 in der Klasse Bruch3:

  1. Was bewirkt die Anweisung "this"?
  2. Wo kann sie noch genutzt werden?
  3. Kann ich hinter "this" noch weitere Anweisungen schreiben?

Warscheinlich ist mein Fehler ein total blöder.
Trotzdem wäre nett wen ihr wenigstens einige meiner Fragn beantworten könnt. :toll: :applaus:
Es würde mir wirklich sehr Helfen. :bloed: :idea:
Wenn ihr noch weiter Tipps für mich habt, teilt sie mir ruhig mit.

Euer "--->"
 
Zuletzt bearbeitet von einem Moderator:
% ist auch nichts anderes als eine division. Wenn du nun hz % hn machst und beide werte sind 0 bekommst du einen div by zero error.

Weiterhin sind hz,hn und r immer 0 und werden auch nie was anderes beinhalten. Sieh Dir Deinen Code noch einmal an. Irgendwo hast du da komplett den Faden verloren.

Gruß

Claus
 
Oh ja,
hab den fehler (der total blöd war ;( 😳) gefunden und behoben.

Danke

Jetzt zeigt Eclipse aber beim ausführen an das dort immer noch ein Fehler ist.
Wen ich auf "trotzdem ausführen" klicke wierd das Programm fehlerfrei ausgeführt. 😱
Wo ist der "Fehler"?
[TIPP]Hat jemand noch einen Tipp für Mich?[/TIPP]
Und kann noch jemand meine Fragen zur "this" Anweisung beantworten?
Wäre echt nett von euch. :applaus: :toll:

Euer "--->"
 
Zuletzt bearbeitet von einem Moderator:
In diesem Programm befinden sich ein Fehler der vom Editor nicht angezeigt wierd. :noe: ;(
Es erscheint nur eine, für mich unverständliche Fehlermeldung:

Code:
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at VerkettenVonKonstruktoren.Bruch3.<init>(Bruch3.java:19)
	at VerkettenVonKonstruktoren.Bruch3.<init>(Bruch3.java:31)
	at VerkettenVonKonstruktoren.VerkettenVonKonstruktoren.main(VerkettenVonKonstruktoren.java:6)

Hierbei handelt es sich um eine ganz normale Exception die fliegt weil zur Laufzeit ein Fehler passiert (in diesem Fall eine nicht mögliche Division durch 0).
Die 1.Zeile verrät dir normal um welche Exception es sich handelt und eine weitere Fehlerbeschreibung! Die weiteren Zeilen enthalten den sogenannten StackTrace dieser verrät dir genau in welcher Zeile, bei welcher Klasse dieser Fehler passiert ist.


Java:
package VerkettenVonKonstruktoren;

class Bruch3 {
    int zaehler;
    int nenner;

    Bruch3(int z, int n) {
	int hz;
	int hn;
	int r;
	hz = 0;
	hn = 0;
	r = 0;
	if (n == 0) {
	    System.out.print("Fehler! Der Nenner darf nicht 0 sein!");
	} else {
	    hz = hn;
	    hn = r;
	    r = hz % hn;
	    while (r > 0) {
		hz = hn;
		hn = r;
		r = hz % hn;
	    }
	    zaehler = z / hn;
	    nenner = n / hn;
	}
    }
}

Der Fehler liegt doch klar auf der Hand:

im Konstruktor
Code:
Bruch3(int, int)
werden
Code:
hz, hn und r
auf 0 gesetzt. Bei
Code:
r = hz % hn
wird durch 0 dividiert! Daher auch diese Exception -> Lösung: hz, hn richtige Werte zuweisen bevor du mit diesen rechnest!
 
Außerdem habe ich noch Fragen zu den Zeilen 30 bis 36 in der Klasse Bruch3:

  1. Was bewirkt die Anweisung "this"?
  2. Wo kann sie noch genutzt werden?
  3. Kann ich hinter "this" noch weitere Anweisungen schreiben?

Code:
this
ist ein Zeiger auf die Referenz des aktuellen Objektes!
Du kannst
Code:
this
immer verwenden du eine andere Methode in der gleichen Klasse aufrufen willst.

Beispiel:

Java:
public class Car {

  private String color;

  public Car() {
    this.color = "red"; // in diesem Fall ist "this" nicht notwendig, da sich color hier eindeutig auf das Attribut bezieht
  }

  public void drive() {
  }

  public void doSomething() {
    this.drive();
  }

  public void setColor(String color) {
     this.color = color; // hier musst du "this" verwenden, ohne würdest du den Wert des Parameters neu setzen - sinnfreier weise auf den gleichen Wert ;)
  }
 
Code:
this
ist ein Zeiger auf die Referenz des aktuellen Objektes!

Das "this", welches du beschreibst, ist nicht sein "this()"!

Dein "this" (ohne Klammer) ist ein Wert, sein "this" (mit Klammern) ist eine Methode. In seinem Fall ruft ein Konstruktor einen anderen Konstruktor auf. Das Ergebnis ist, dass man mehrere Konstruktoren hat, die sich in der Art und Anzahl der Argumente unterscheiden. Typischerweise macht man dadurch bestimmte Argumente eines Konstruktors optional, indem man einen Default-Wert definiert. Genau das passiert auch in seinem Beispiel.

Man kann eine Instanz von Bruch3 dadurch erzeugen, dass man Zählen und Nenner angibt:
Java:
new Bruch3 (1, 2);
Das ist der Normalfall.

Aber man kann aber auch nur ein Argument angeben:
Java:
new Bruch3 (1);
In diesem Fall wird der Nenner auf 1 gesetzt.

Oder man lässt alle Argumente weg. Dann erhält man immer die Zahl Null.
Java:
new Bruch3 ();

Allerdings wäre die konsequente Implementation des letztens Falls eigentlich so:
Java:
Bruch3() {
  this(0);
}
Die 1 ist redundant also ein Verstoß gegen das DRY-Prinzip.
 
Zuletzt bearbeitet:
Danke Leute,
für eure umfassenden Antworten. :toll: :applaus:
Ihr habt mir wirklich sehr weitergeholfen
und viele Verständnisprobleme gelöst. :bloed: :idea:

euer "--->"
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben