# Fehler bei Java Übung für Interfaces



## skiibi (7. Jun 2015)

Hallo,

ich bin neu hier und entschuldigt, wenn ich nicht genügend angaben mache oder ähnliches. Ich probiere es so klar, wie mir selbst möglich zu beschreiben 

Wir haben derzeit eine Java-Übung für Interfaces. Soweit habe ich das Programm durch, dennoch bekomme ich immer einen  "java.lang.AssertionError:-Fehler"  für meine Funktion "iroot[int]". Angeblich sei der Rückgabewert nicht korrekt. Da ich eigentlich ein absoluter leihe bin und den Fehler selbst nicht finde, bitte ich hiermit um Hilfe ???:L

Aufgabe:

Neben den beiden ¨offentlichen Getter-Methoden double getX() und double getY(), wobei dieMethode getX() den Inhalt des Attributs real und die Methode getY() den Inhalt des Attributsimag zuruckgeben soll, sind außerdem die folgend aufgelisteten Methoden umzusetzten: ¨

• Methode public double getAbs(), Diese Methode berechnet den Betragpr der komplexen Zahl z = x + yi mit r = |z| =x2 + y2 und gibt diesen zurück. 

• Methode public double getPhi().Diese Methode berechnet den Winkel φ der komplexen Zahl z = x + yi und gibt diesenzuruck. Nutzen Sie zur Berechnung des Winkels die Funktion ¨ java.lang.Math.atan2()

• Methode public Complex[] iroot(int n), 6P.Diese Methode soll eine Array vom Typ Complex zuruckgeben und die ¨ n-te komplexeWurzel berechnen. Im Fehlerfall soll null zuruck gegeben werden. ¨

Die n-te Wurzel einer komplexen Zahl a liefert k komplexe Zahlen (z1, . . . , zk), die sich wiefolgt berechnen:zk =pn|a| · e(i·ϕ+2kπn)(k = 0, 1, . . . , n − 1)

Testen Sie die Methode iroot(), indem Sie in Ihrer main()-Methode verschiedene komplexeZahlen erzeugen und sich von diesen die komplexe Wurzel grafisch anzeigen lassen.


```
package mathpaint;


import math.graph.XYPunkt;


public class Complex implements XYPunkt {
    private double real, imag, Phi, Abs;


    public double getX() {
        return real;
    }


    public double getY() {
        return imag;
    }


    public Complex (double real, double imag) {
        this.real = real;
        this.imag = imag;
    }


    public double getAbs() {
        return Abs = Math.sqrt(Math.pow(this.real,2.) + Math.pow(this.imag,2.));
    }


    public double getPhi() {
        return Phi = Math.atan2(this.real, this.imag);
    }


    public void iroot(int n) {
        Complex wurzel[] = new Complex[n];


        for (int i = 0; i < n; i++) {
            double Betrag = Math.pow(getAbs(), 1./n);
            double Winkel = getPhi();


            wurzel[i] = new Complex( Betrag * Math.cos( (Winkel + ( 2 * Math.PI * i ) ) / n), Betrag * Math.sin( (Winkel + ( 2 * Math.PI * i ) ) / n));
        }
    }


}
```

Weiterhin bekomme ich die Fehlermeldung für:-The value of the field Complex.Abs is not used                                                                              -The value of the field Complex.Phi is not used

Ist doch aber?!

Ich bedanke mich recht herzlich für eure Mühe.

MfG


----------



## Saheeda (7. Jun 2015)

Deine Methode iroot hat den Rückgabewert "void", in der Aufgabenstellung steht aber etwas von "Complex[]".
Damit ist es nicht dieselbe Methode wie im Interface.

Hier:

```
public double getAbs() {
        return Abs = Math.sqrt(Math.pow(this.real,2.) + Math.pow(this.imag,2.));
    }
 
 
    public double getPhi() {
        return Phi = Math.atan2(this.real, this.imag);
    }




    //so: 
    public double getPhi() {
          Phi = Math.atan2(this.real, this.imag);
         return Phi;
    }

    //oder so:
    public double getPhi() {
         return Math.atan2(this.real, this.imag);
    }
```
Weißt du den Variablen Werte zu und gibst sie im selben Schritt zurück, damit werden die Variablen nicht genutzt.


----------



## skiibi (7. Jun 2015)

Also müsste ich nur den return rausnehmen richtig verstanden?


----------



## Saheeda (7. Jun 2015)

Nein, das würde einen Kompilierfehler geben. Wenn die Methode etwas zurückgeben soll, dann braucht sie auch eine return-Anweisung.
Siehe mein Beitrag oben, dort habe ich im Code zwei Beispiele geschrieben, wie du es stattdessen machen könntest.

Meines Erachtens brauchst du aber die beiden globalen Variablen Phi und Abs nicht. Wenn eine Methode "getPhi" heißt, erwarte ich schlicht, dass da irgendein phi zurück kommt.


----------



## skiibi (7. Jun 2015)

Okay, nun bekomme ich allerdings die Fehlermeldung: 
java.lang.AssertionError: Fehler: in Klasse 'mathpaint.Complex', vorgegebene Methode '[Lmathpaint.Complex; iroot([int]) nicht gefunden - Rueckgabewert nicht korrekt

ich glaube das ganze Ding ist ziemlich verhunzt geworden :O


----------



## Saheeda (7. Jun 2015)

Schau dir doch mal genau an, was die Fehlermeldung sagt, und bei welcher Zeile sie auftritt. Sie ist eigentlich schon ziemlich eindeutig.
Ich helfe dir gern, aber ein bisschen Eigeninitiative musst du auch zeigen.

Ansonsten ist es ohne Code schwer zu beurteilen, warum du einen Fehler bekommst.


----------



## skiibi (7. Jun 2015)

Okay, ich probiere mich noch mal daran =) danke erst einmal für deine Hilfe =)


----------



## skiibi (7. Jun 2015)

Okay, ich glaube ich habe es nun verstanden.

Er bekommt nur das "void" vor dem iroot und ich habe iroot nicht deklariert?! Habe ich das so richtig verstanden? aber warum bekommt er nur das "void"?


----------



## Saheeda (7. Jun 2015)

In der Aufgabenstellung ist von "Methode public Complex[] iroot(int n)" die Rede. Ich nehme mal an, diese ist im Interface XYPunkt definiert.

Deine Methode iroot muss genau so aussehen, keine anderen Rückgabetypen, keine anderen Parameter.

Ansonsten weiß ich nicht, was du mit "er bekommt nur das void" meinst. Bei den meisten IDEs kann man die durchs Interface definierten Methoden-Rümpfe generieren lassen, diese haben dann aber auch automatisch die richtigen Rückgabe- und Parametertypen.


----------



## skiibi (7. Jun 2015)

```
test/TestInterfaces.java:303: incompatible types
found   : void
required: mathpaint.Complex[]
            test = c.iroot(-5);
                          ^
test/TestInterfaces.java:309: incompatible types
found   : void
required: mathpaint.Complex[]
            test = c.iroot(0);
                          ^
test/TestInterfaces.java:322: incompatible types
found   : void
required: mathpaint.Complex[]
        test = c.iroot(n);
                      ^
test/TestInterfaces.java:348: incompatible types
found   : void
required: mathpaint.Complex[]
                    randomComplexNumber.getY()).iroot(n); [COLOR=#333333]                                      ^[/COLOR]
```

Das meinte ich mit "void"

Entschuldige die Mühe, dennoch arbeite ich das erste mal mit einem solchen "Auswertungsprogramm" und kann es daher eher weniger auslesen.


----------



## Saheeda (7. Jun 2015)

Und wie sieht deine Complex-Klasse aus? Welchen Rückgabetyp hat die Methoden dort? Wenn es immer noch void ist, wie ganz oben im Eingangspost, dann solltest du dort zuerst ansetzen.

Wie gesagt, die Methode muss exakt genau so aussehen, wie im Interface....


----------



## skiibi (7. Jun 2015)

Die ich oben eingebunden hatte, in der Fragestellung ist meine Complex-Class.


----------



## Saheeda (7. Jun 2015)

Dann ändere den Rückgabetyp auf Complex[] und gib wurzel zurück?


----------



## skiibi (7. Jun 2015)

Okay, das habe ich jetzt hinbekommen :lol:

kriege ich nur noch 7 andere Fehler jetzt bei den Berechnungen  

Danke erst einmal ^^


----------

