Ausnahmebehandlung

Aloushi

Mitglied
Hallo,
kann bitte jemand kontrollieren, ob ich die Ausnahmebehandlung richtig implementiert habe? Den letzten Absatz habe ich noch nicht implementiert, da ich etwas überfordert bin^^.
Die Aufgabenstellung poste ich in einem zusätzlichen Kommentar der Übersichthalber.
Java:
public static void main(String[] args) throws WrongDimensionException, NullvectorException {

        System.out.println(normalizeVector3D(null));
        System.out.println(vectorSum(new int[] { 2, 2, 2 }));
    }

    public static double[] normalizeVector3D(int[] integerArray) throws WrongDimensionException, NullvectorException {

        
        
        
        int dimensionArray = 0;
        try {

            if (integerArray.length < 3 || integerArray.length > 3) {
                for (int i = 0; i < integerArray.length; i++) {
                    dimensionArray++;
                }
                throw new WrongDimensionException("Falsche Dimension " + dimensionArray);
            }
        } catch (NullPointerException e) {
            System.out.println("Übergebene Array ist gleich Null");
        }

        double result = vectorSum(integerArray);

        result = ((1 / (Math.sqrt(result))));
        result = Math.round(result * 1000.0) / 1000.0;
        System.out.println(result);
        

        double[] doubleArray = new double[(integerArray.length)];
        for (int i = 0; i < integerArray.length; i++) {
            doubleArray[i] = integerArray[i];
        }

        
        for (int i = 0; i < doubleArray.length; i++) {
            doubleArray[i] *= Math.round(result * 1000.0) / 1000.0;
        }

        System.out.println(Arrays.toString(doubleArray));
        return doubleArray;

    }

    public static int vectorSum(int[] x) throws NullvectorException {

        try {

            for (int i = 0; i < x.length; i++) {
                if (x[i] == 0 && x[i + 1] == 0 && x[i + 2] == 0) {
                    throw new NullvectorException("Das übergeben Array ist ein Nullvektor");
                }
            }
        } catch (NullPointerException e) {
            System.out.println("Übergebene Array ist gleich Null");
        }

        int result = 0;
        for (int i = 0; i < x.length; i++) {
            result += x[i] * x[i];

        }
        return result;
    }
 

Aloushi

Mitglied
Implementieren Sie eine statische public Methode mit dem Namen normalizeVector3D, die ein Integer Array übergeben bekommt und ein Double Array zurückgibt. Das Array stellt dabei einen Vektor für den 3 dimensionalen Raum dar, der normalisiert werden soll (https://de.wikipedia.org/wiki/Einheitsvektor ). Das Ergebnis soll dabei für jede Dimension auf 3 Nachkommastellen gerundet werden. Falls der übergebene Vektor mehr oder weniger als 3 Einträge hat soll eine WrongDimensionException mit einer Ausgabe geworfen werden. Die WrongDimensionException muss von Exception erben. Die Ausgabe soll von der Exception (ohne ein eigenes System.out.println) vorgenommen werden und einen geeigneten Text mit der Angabe der Dimension des übergebenen Arrays enthalten. Falls das übergebene Array null ist soll eine NullPointerException mit einer passenden Nachricht geworfen werden.

Zur Berechnung der Summe der Quadrate der einzelnen Dimensionen (siehe Berechnung Einheitsvektor) soll eine zweite Methode mit dem Namen vectorSum implementiert werden. Diese Methode bekommt ein Integer Array übergeben und gibt einen Integer zurück. Der Integer soll dabei die Summe aller Einträge des übergebenen Arrays sein. Sollte das übergebene Array ein Nullvektor sein, d.h. alle Einträge 0 sein, so soll eine NullvectorException geworfen werden. Die NullvectorException soll von Exception erben. Diese soll auch mit einer Message aufrufbar sein, jedoch soll der Default-Konstruktor erhalten bleiben. Falls das übergebene Array gleich null ist soll auch hier wieder eine NullPointerException geworfen werden.

Die Methode normalizeVector3D soll die die Methode vectorSum nutzen und im Falle einer NullvectorException das folgende Array zurückgeben: [Double.NaN, Double.NaN, Double.NaN]
Falls vectorSum eine NullPointerException wirft, soll dies ebenfalls in der Methode normalizeVector3D abgefangen und das Array [Double.NaN, Double.NaN, Double.NaN] plus einem passenden System.out zurückgegeben werden.
 
K

kneitzel

Gast
Der letzte Abschnitt besagt doch nur, dass im Falle von zwei Exceptions ein bestimmtes Verhalten erfolgen soll. Daher musst Du Dir überlegen, wie Du in der Methode auf diese Exceptions reagieren kannst um dann entsprechend zu reagieren.
 
K

kneitzel

Gast
Wie genau kann denn ein Double.NaN Array zurückgegeben werden?
Es soll ein double Array mit 3 Werten zurück gegeben werden und jeder Wert soll Double.NaN sein.

Wie man ein Array anlegt und mit Werten füllt, hast Du ja schon in Deinem Code. Und Double.NaN kannst Du so verwenden wie du auch eine Fließkommazahl wie 1.0 verwendest.
 

Aloushi

Mitglied
Es soll ein double Array mit 3 Werten zurück gegeben werden und jeder Wert soll Double.NaN sein.

Wie man ein Array anlegt und mit Werten füllt, hast Du ja schon in Deinem Code. Und Double.NaN kannst Du so verwenden wie du auch eine Fließkommazahl wie 1.0 verwendest.
weisst du zufällig weshalb mir bei der rechnung manchmal ein double mit 20 nachkommastellen ausgepuckt wird, obwohl ich diesen auf drei nachkommastellen gerundet habe?
 
K

kneitzel

Gast
weisst du zufällig weshalb mir bei der rechnung manchmal ein double mit 20 nachkommastellen ausgepuckt wird, obwohl ich diesen auf drei nachkommastellen gerundet habe?
Du meinst den Code: Math.round(result * 1000.0) / 1000.0;?

Der Rechner arbeitet mit dualen Zahlen. Und Du lässt Dir diese im 10er System anzeigen und versuchst da im 10er System das Runden zu machen. Das kann so nicht funktionieren, denn viele Zahlen im 10er System lassen sich im dualen System nicht wirklich darstellen.

Den Wert von einzelnen Bits hast Du ja vor dem Komma mit 2^0, 2^1, 2^2, .... und nach dem Komma sind die Werte 2^-1, 2^-2, 2^-3, .... also 0,5, 0,25, 0,125, ....

Nun stell einfach einmal die 0,1 des 10er Systems als Duale Zahl da. Du wirst dann irgend was heraus bekommen wie 0,0001.... Bei der Berechnung wirst Du dann nach irgend einer Anzahl Stellen aufhören und wirst aber immer noch nicht genau die 0,1 bekommen haben. Somit hast Du bei den bisherigen Bits nur ein 0,09999..... oder so (hängt halt davon ab, wann Du aufgehört hast.

Das, was Du hier bei der 0.1 gesehen hast, hast Du generell auch bei Deiner Berechnung. Die Dezimale Zahl mit 3 Nachkommastellen ist einfach nicht im dualen System genau abbildbar. Daher wird nur eine ungefähre Darstellung gespeichert.

Eine Möglichkeit: Bei der Anzeige begrenzt Du auch auf 3 Nachkommastellen - dann sollte es entsprechend angezeigt werden.
 

Aloushi

Mitglied
Du meinst den Code: Math.round(result * 1000.0) / 1000.0;?

Der Rechner arbeitet mit dualen Zahlen. Und Du lässt Dir diese im 10er System anzeigen und versuchst da im 10er System das Runden zu machen. Das kann so nicht funktionieren, denn viele Zahlen im 10er System lassen sich im dualen System nicht wirklich darstellen.

Den Wert von einzelnen Bits hast Du ja vor dem Komma mit 2^0, 2^1, 2^2, .... und nach dem Komma sind die Werte 2^-1, 2^-2, 2^-3, .... also 0,5, 0,25, 0,125, ....

Nun stell einfach einmal die 0,1 des 10er Systems als Duale Zahl da. Du wirst dann irgend was heraus bekommen wie 0,0001.... Bei der Berechnung wirst Du dann nach irgend einer Anzahl Stellen aufhören und wirst aber immer noch nicht genau die 0,1 bekommen haben. Somit hast Du bei den bisherigen Bits nur ein 0,09999..... oder so (hängt halt davon ab, wann Du aufgehört hast.

Das, was Du hier bei der 0.1 gesehen hast, hast Du generell auch bei Deiner Berechnung. Die Dezimale Zahl mit 3 Nachkommastellen ist einfach nicht im dualen System genau abbildbar. Daher wird nur eine ungefähre Darstellung gespeichert.

Eine Möglichkeit: Bei der Anzeige begrenzt Du auch auf 3 Nachkommastellen - dann sollte es entsprechend angezeigt werden.
dankeschön :)
 

Ähnliche Java Themen

Neue Themen


Oben