Verwendung von Interfaces

ArnoDorian

Neues Mitglied
Hi,
ich war bisher stiller Mitleser allerdings habe ich nun ein Problem mit meinem Code und ich komme einfach nicht drauf was falsch sein könnte. Google half leider auch nicht weiter. Es geht darum den richtigen Umgang mit Interfaces zu erlernen. Gegeben sind folgende Klassen:

Java:
package exercise02;

public interface Polygon {

    public Point[] allVertexes();
 
    public double perimeter();
 
    public double area();

    public void move(double dx, double dy);
}

Und:

Java:
package exercise02;

//Die nachfolgende Klasse repraesentiert einen Punkt in einem
//zweidimensionalen Koordinatensystem.

public class Point {
  
    // Die Instanzvariablen zur Aufnahme der Koordinatenwerte
    private double x, y;
  
    // Konstruktor mit Uebergabe der x und y - Koordinate
    Point(double x, double y)
    {
        this.x = x;
        this.y = y;
    }//endconstructor
  
    // Auslesen der x-Koordinate
    double getX()
    {
        return x;
    }//endmethod getX
  
    // Auslesen der y-Koordinate
    double getY()
    {
        return y;
    }//endmethod getY
  
    // Abstand zu einem anderen Punkt
    double distance(Point other)
    {
        double dx = getX()-other.getX();
        double dy = getY()-other.getY();      
        return Math.sqrt(dx*dx + dy*dy);
    }//endmethod distance
  
    // Erzeugung eines neuen Punktes, der zum Ausgangspunkt verschoben ist
    Point moved(double deltaX, double deltaY)
    {
        return new Point(getX() + deltaX, getY() + deltaY);
    }//endmethod moved
  
    // Rueckgabe der Koordinaten in einem String in lesbarer Form
    public String toString()
    {
        return String.format("(%.2f;%.2f)", getX(), getY());
    }//endmethod toString
  
}//endclass

Die Aufgabe ist die Klasse "Triangle" zu implementieren inkl. Methode zum Testen.


Das ist meine Triangle Klasse:
Java:
package exercise02;
public class Triangle
{
    private Point p1;
    private Point p2;
    private Point p3;
    private  Point [] feld_ref= new Point[3];
    public Triangle (Point p1, Point p2, Point p3)
    {
        feld_ref[0]=p1;
        feld_ref[1]=p2;
        feld_ref[2]=p3;
    }
   
    public Point[] allVertexes()
    {
        return feld_ref;
    }
   
    public double perimeter()
    {
        double distance1=p1.distance(p2);
        double distance2=p2.distance(p3);
        double distance3=p3.distance(p1);
        double perimeter=distance1+distance2+distance3;
        return perimeter;
    }
    public double area()
    {
        double s=0.5*(perimeter());
        double flaeche=Math.sqrt(s* (s-(p1.distance(p2))) * (s-(p2.distance(p3))) * (s-p3.distance(p1)));
       
        return flaeche;
       
    }
        public static void main(String[] args)
        {
            Point p1=new Point(0.0, 0.0);
            Point p2=new Point(1.0, 0.0);
            Point p3=new Point(0.0, 1.0);
   
            Triangle dreieck= new Triangle(p1, p2, p3);
   
            dreieck.allVertexes();
            dreieck.perimeter();
            dreieck.area();
        }
}

Ich meine ich wäre soweit fertig jedoch bekomme ich immer den Fehler:
Exception in thread "main" java.lang.NullPointerException
at exercise02.Triangle.perimeter(Triangle.java:26)
at exercise02.Triangle.main(Triangle.java:50)

Kann mir wer einen Tipp geben ich bin so langsam mit meinem Latein am Ende.
 

Joose

Top Contributor
Im Konstruktor von "Triangle" legst du die 3 Point Objekte ins Array. Deine 3 Instanzvariable p1, p2 und p3 bleiben uninitialisiert.
Sobald du die Methode "perimeter" aufrufst, willst du die "distance" Methode von p1 aufrufen. Da dies aber nicht initialisiert ist (->null) fliegt entsprechende Exception.

Lösung: Entweder verwendest du in perimeter statt den Variable p1, p2, p3 die entsprechenden Objekte aus dem "feld_ref" Array. Oder du initialisiert die Variablen im Konstruktor richtig.

Anmerkung: Ich finde es unnötig die 3 Punkte doppelt zu speichern in deinem Triangle Objekt. Ich würde mich entweder für das Array oder für die 3 einzelnen Variablen entscheiden.
Warum? -> Würdest du einen Punkt austauschen wollen, dann musst du daran denken das hier 2 Variablen angepasst werden müssen. Das wäre zu fehleranfällig.

Anmerkung 2: Du verwendest das Interface nirgends.
Ich nehme an deine Klasse Triangle sollte diese Interface implementieren. Du hast zwar in der Klasse Methoden, welche denen im Interface entsprechend. Aber das reicht nicht, du musst noch ein "implements Polygon" an die Klasse hängen :)
 

Kababär

Top Contributor
Deine Points in perimeter sind null. Anstatt auf die Pointer zuzugreifen (du greifst auf die Klassenvariablen zu, welche nicht initialisiert wurden) würde ich auf das Array zugreifen.

edit: Oops. Hab die Seite nicht neu geladen.
 

ArnoDorian

Neues Mitglied
Danke ich glaube ich habs. Er gibt mir zumindest die Fläche und Umfang mal korrekt aus. Das Interface habe ich implementiert, danke hatte ich voll übersehen :)

edit (ich weiß nicht ob Doppelposts gestattet sind, deshalb editiere ich mal)

Ich habe eben noch die Verschiebe den Punkt Methode eingefügt und jetzt klappt alles. Ich vermute mal der Code ist nicht besonders schön oder effizient aber es klappt :)

Java:
package exercise02;
public  class Triangle implements Polygon //Interface implementieren
{
    private Point p1=new Point(0.0, 0.0);
    private Point p2=new Point(1.0, 0.0);
    private Point p3=new Point(0.0, 1.0);
    private  Point [] feld_ref= new Point[3];
    public Triangle (Point p1, Point p2, Point p3)
    {
        feld_ref[0]=p1;
        feld_ref[1]=p2;
        feld_ref[2]=p3;
    }
    
    public Point[] allVertexes() //Alle Vektoren
    {
        return feld_ref;
    }
    
    public double perimeter() //Umfang
    {
        double distance1=p1.distance(p2);
        double distance2=p2.distance(p3);
        double distance3=p3.distance(p1);
        double perimeter=distance1+distance2+distance3;
        return perimeter;
    }
    public double area() //Fläche
    {
        double s=0.5*(perimeter());
        double flaeche=Math.sqrt(s* (s-(p1.distance(p2))) * (s-(p2.distance(p3))) * (s-p3.distance(p1)));
        
        return flaeche;
          
    }
   
    public void move(double dx, double dy)
    {
        p1=p1.moved(dx,dy);
        p2=p2.moved(dx,dy);
        p3=p3.moved(dx,dy);
       
    }
       
        public static void main(String[] args) //Zum Testen
        {
             Point p1=new Point(0.0, 0.0);
             Point p2=new Point(1.0, 0.0);
             Point p3=new Point(0.0, 1.0);
    
            Triangle dreieck= new Triangle(p1, p2, p3);
    
            dreieck.allVertexes();
            dreieck.perimeter();
            dreieck.area();
            dreieck.move(+2.0,-2.0);
           
            System.out.println(p1);
            System.out.println(p2);
            System.out.println(p3);
            System.out.println(dreieck.perimeter()+" Erwartet: 3.414213562373095");
            System.out.println(dreieck.area()+ " Erwartet: 0.49999999999999983");
            System.out.println("Verschiebe den Punkt um die Distanz: +2.0; -2.0");
            System.out.println(p1.moved(+2.0,-2.0));
            System.out.println(p2.moved(+2.0,-2.0));
            System.out.println(p3.moved(+2.0,-2.0));
        }

       
}

@Joose: Das die Punkte nicht doppelt gespeichert werden hab ich leider nicht hinbekommen.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Also ich habe mal ein paar Änderungen gemacht und mit Kommentaren versehen. Aber alles ganz ungetestet, da ich auch keine Point Klasse von Dir habe und ich da jetzt auch keine IDE angeworfen habe. Also Fehler bitte etwas nachsehen!
Code:
public  class Triangle implements Polygon  //Interface implementieren
{
    // Diese Variablen werden nicht fix initialisiert - das soll im Konstruktor erfolgen!
    private Point p1;
    private Point p2;
    private Point p3;

    // Das brauchen wir nicht!
    // private  Point [] feld_ref= new Point[3];
    public Triangle (Point p1, Point p2, Point p3)
    {
        this.p1=p1;
        this.p2=p2;
        this.p3=p3;
    }

    public Point[] allVertexes() //Alle Vektoren
    {
        // Hier erstellen wir ein Array und geben es direkt zurück.
        return new Point[] {p1, p2, p3};
    }

    public double perimeter() //Umfang
    {
        double distance1=p1.distance(p2);
        double distance2=p2.distance(p3);
        double distance3=p3.distance(p1);
        double perimeter=distance1+distance2+distance3;
        return perimeter;
    }
    public double area() //Fläche
    {
        double s=0.5*(perimeter());
        double flaeche=Math.sqrt(s* (s-(p1.distance(p2))) * (s-(p2.distance(p3))) * (s-p3.distance(p1)));

        return flaeche;

    }

    public void move(double dx, double dy)
    {
        p1=p1.moved(dx,dy);
        p2=p2.moved(dx,dy);
        p3=p3.moved(dx,dy);

    }

    public static void main(String[] args) //Zum Testen
    {
        Point p1=new Point(0.0, 0.0);
        Point p2=new Point(1.0, 0.0);
        Point p3=new Point(0.0, 1.0);

        Triangle dreieck= new Triangle(p1, p2, p3);

        dreieck.allVertexes();
        dreieck.perimeter();
        dreieck.area();
        dreieck.move(+2.0,-2.0);

        System.out.println(p1);
        System.out.println(p2);
        System.out.println(p3);
        System.out.println(dreieck.perimeter()+" Erwartet: 3.414213562373095");
        System.out.println(dreieck.area()+ " Erwartet: 0.49999999999999983");
        System.out.println("Verschiebe den Punkt um die Distanz: +2.0; -2.0");
        System.out.println(p1.moved(+2.0,-2.0));
        System.out.println(p2.moved(+2.0,-2.0));
        System.out.println(p3.moved(+2.0,-2.0));
    }
}

Ich hoffe, dass dies alles etwas verständlicher macht.
 

Kababär

Top Contributor
Eventuell brauchen wir das doch, wenn er eine Methode "addPoint" schreibt und diese irgendwo abspeichern will. Ist also an sich keine schlechte Idee. Zur Laufzeit einen neuen Punkt machen und zur Liste/Array hinzufügen.

Die Point-Klasse ist der zweite Code :)
 
K

kneitzel

Gast
Also Triangle hat drei Punkte. Da wird kein vierter Punkt hinzu gefügt. Somit ist eine solche Anforderung sehr unwahrscheinlich.
 

Kababär

Top Contributor
Ok, so weit habe ich nicht gedacht :D

(Aber wenn er mehrere Klassen erstellt [Linie, Rechteck, Fünfeck, ... ], dann könnte es nützlich werden. Wenn man anhand der Listenlänge erkennen kann, um welches der Objekte es sich handelt {würde sehr wahrscheinlich eh anders realisiert werden})
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
T Verwendung jna Java Basics - Anfänger-Themen 15
L Zufälligen Zahlencode, ohne mehrfacher Verwendung einer Ziffer Java Basics - Anfänger-Themen 15
S Exception bei Verwendung von LocalDate Java Basics - Anfänger-Themen 19
S Try-Catch in Verwendung einer while Schleife Java Basics - Anfänger-Themen 2
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
b1ck Scanner schließen, erneute Verwendung Java Basics - Anfänger-Themen 12
H Datentypen Fehler bei Verwendung von enum Java Basics - Anfänger-Themen 9
G Variablen Verwendung von Variablen in anderer Klasse Java Basics - Anfänger-Themen 6
G Verwendung von Konstruktor Java Basics - Anfänger-Themen 8
M Verwendung von System.exit(0) problematisch? Java Basics - Anfänger-Themen 1
D native Methoden, Verwendung? Java Basics - Anfänger-Themen 8
fLooojava kleines Projekt - Verwendung von Youtube Java Basics - Anfänger-Themen 22
X Array Ausgabe bei Verwendung von 2 Schleifen erklären Java Basics - Anfänger-Themen 8
G verwendung von regex Java Basics - Anfänger-Themen 3
K Problem bei der Verwendung von Gregorian Calender Java Basics - Anfänger-Themen 3
T NullPointerException bei Verwendung einer Klasse einer anderen .jar datei Java Basics - Anfänger-Themen 3
B Wie wichtig ist Verwendung von StringBuffer in Schleifen? Java Basics - Anfänger-Themen 10
B Verwendung von Arrays Java Basics - Anfänger-Themen 2
U Verwendung von Interface Java Basics - Anfänger-Themen 33
A Methoden Verwendung von crypt? Java Basics - Anfänger-Themen 2
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
D reg Exp, verwendung des endezeichen "$" Java Basics - Anfänger-Themen 5
C Verwendung von Schleifen? Java Basics - Anfänger-Themen 18
J Datentypen Array - Verwendung im Konstruktor Java Basics - Anfänger-Themen 8
C Verwendung von primitiven Datentypen Java Basics - Anfänger-Themen 8
J Problem mit NullPointerException bei Verwendung eines Arrays Java Basics - Anfänger-Themen 6
D Frage zur Verwendung einer Schnittstelle Java Basics - Anfänger-Themen 4
A Verwendung von abstrakten Klassen Java Basics - Anfänger-Themen 17
D Verwendung der Klasse Map Java Basics - Anfänger-Themen 9
C Verwendung von Matrizen in einer Schleife Java Basics - Anfänger-Themen 5
F Umlaute eines Strings entfernen (Verwendung von this?) Java Basics - Anfänger-Themen 2
Daniel_L Verwendung von try und catch bei exceptions Java Basics - Anfänger-Themen 7
I Verwendung von Constant Field Values Java Basics - Anfänger-Themen 4
J Verwendung von eigenen Klassen in JSP Java Basics - Anfänger-Themen 2
G try. catch Verwendung Java Basics - Anfänger-Themen 11
Z Beispiel Würfelspiel mit Verwendung von Feldern Java Basics - Anfänger-Themen 7
H Verwendung lokaler Einstellungen Java Basics - Anfänger-Themen 4
G getName, substring Verwendung Java Basics - Anfänger-Themen 3
I Fehler bei Verwendung von substring Java Basics - Anfänger-Themen 4
S Verwendung von Super Java Basics - Anfänger-Themen 7
M Verwendung von Robot... wie? Java Basics - Anfänger-Themen 6
M Verwendung von "this" Java Basics - Anfänger-Themen 2
U Liste importieren und für weitere Verwendung sichern Java Basics - Anfänger-Themen 4
feuervogel Integral unter Verwendung der Java-Bibliothek berechnen Java Basics - Anfänger-Themen 10
frau-u Probleme mit richtiger Verwendung von FileInputStream Java Basics - Anfänger-Themen 2
S valueOf() vs. toString() Verwendung??? Java Basics - Anfänger-Themen 13
A Kurze Frage zur Verwendung von this Java Basics - Anfänger-Themen 9
S Verwendung bitweiser Operatoren Java Basics - Anfänger-Themen 6
F Verwendung von this in statischen Kontext nicht möglich Java Basics - Anfänger-Themen 8
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Wozu dient Interfaces? Java Basics - Anfänger-Themen 6
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
M Interfaces Aufgabe Java Basics - Anfänger-Themen 2
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
I XML und Interfaces aus anderen Projekten Java Basics - Anfänger-Themen 3
8u3631984 Record - Interfaces Java Basics - Anfänger-Themen 4
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
H Sinn von Interfaces Java Basics - Anfänger-Themen 21
B JaxB und Interfaces? Java Basics - Anfänger-Themen 2
M Funktionale Interfaces Java Basics - Anfänger-Themen 3
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Zweck von Interfaces immer noch nicht klar Java Basics - Anfänger-Themen 3
M Klasse erbt von Interfaces Java Basics - Anfänger-Themen 6
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
T Abstrakte Klasse und Interfaces Java Basics - Anfänger-Themen 12
H Polymorphie Interfaces und statischer Typ Java Basics - Anfänger-Themen 33
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
F Exceptions in Interfaces Java Basics - Anfänger-Themen 4
F Interface Warum Interfaces? Java Basics - Anfänger-Themen 5
R interfaces Java Basics - Anfänger-Themen 1
B Interfaces Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
D Interface Wieso Aufruf aller Methoden eines Interfaces? Java Basics - Anfänger-Themen 11
J Interfaces? Java Basics - Anfänger-Themen 32
M Erstellung Interfaces....totale Anfängerfrage Java Basics - Anfänger-Themen 16
S Erste Schritte Innere Klassen und Interfaces Java Basics - Anfänger-Themen 2
J Wofür dienen Interfaces ? Java Basics - Anfänger-Themen 1
Hijo2006 Frage zu Interfaces Java Basics - Anfänger-Themen 21
Hacer Interfaces implementieren Java Basics - Anfänger-Themen 7
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
L Via Interfaces unterschiedliche Klassen ansprechen Java Basics - Anfänger-Themen 8
J Interfaces Java Basics - Anfänger-Themen 15
D Frage bzgl. Interfaces Java Basics - Anfänger-Themen 10
D Interface Verständnisprobleme von Interfaces Java Basics - Anfänger-Themen 5
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
S Rollen verändern, Interfaces austauschen wie? Java Basics - Anfänger-Themen 10
K Interfaces/Klassen etc. Java Basics - Anfänger-Themen 6
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
S Verständnisproblem bei Interfaces Java Basics - Anfänger-Themen 6
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
O Java Interfaces für andere Programmiersprachen zur Verfuegung stellen? Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
G Instanzen eines Interfaces erzeugen Java Basics - Anfänger-Themen 7
M Compiler-Fehler Alle Methoden eines Interfaces Implementiert dennoch Fehler Java Basics - Anfänger-Themen 3
V Interface Interfaces und abstrakte Klassen Java Basics - Anfänger-Themen 3
F Best Practice UML/Planung eines Projektes (Klassen, Interfaces, ...) Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben