# Schreibe eine Klasse GeradeZahl



## PROGbeginner98 (3. Jan 2022)

Hallo Leute,
ich habe in meinem Studium eine folgende Aufgabe bekommen:
-Schreiben Sie eine Klasse GeradeZahl.
-Schreiben Sie Methoden für die Addition und Multiplikation dieser Klasse.
-Sichern Sie mit geeigneten Ausnahmen, dass eine GeradeZahl auch stets eine gerade Zahl ist.

Wir haben in dem Kapitel Exceptions angesprochen und sollen diese Aufgabe wohl mit einer try-catch Methode ausführen. 
Ich stehe komplett auf dem schlauch. 
Ich habe auch noch keinen richtig Start gefunden.
Wie kann man diese Aufgabe am besten/ einfachsten lösen, ohne Spaghetticode zu bekommen?


----------



## M.L. (3. Jan 2022)

Code hätte man trotzdem posten können...  Zum Start: gerade Zahlen haben einer Rechnung "modulo 2" die Null als Ergebnis.


----------



## kneitzel (3. Jan 2022)

PROGbeginner98 hat gesagt.:


> -Sichern Sie mit geeigneten Ausnahmen, dass eine GeradeZahl auch stets eine gerade Zahl ist.
> 
> Wir haben in dem Kapitel Exceptions angesprochen und sollen diese Aufgabe wohl mit einer try-catch Methode ausführen.


Da solltest Du noch einmal überlegen. Was bedeutet die Anforderung? Was macht try/catch?


----------



## fhoffmann (3. Jan 2022)

PROGbeginner98 hat gesagt.:


> und sollen diese Aufgabe wohl mit einer try-catch Methode ausführen.


Nein, der Aufrufer kann eventuell try-catch benutzen, die Klasse selbst wirft nur die Exception.
EDIT: Sorry @kneitzel, ich hatte deine Antwort noch nicht gelesen.


PROGbeginner98 hat gesagt.:


> Ich habe auch noch keinen richtig Start gefunden.


Der Start wird ja wohl sein:

```
public class GeradeZahl {

}
```


----------



## Mart (3. Jan 2022)

die frage ist wann hast du einen Fehler in der GeradeZahl klasse? wahrshceinlich dann wenns ungerade ist und das solltest du wahrscheinlich behandeln


----------



## PROGbeginner98 (3. Jan 2022)

kneitzel hat gesagt.:


> Da solltest Du noch einmal überlegen. Was bedeutet die Anforderung? Was macht try/catch?


Okay mit try/catch macht es wenig Sinn. habe gerade noch einmal nachgelesen was es macht.


fhoffmann hat gesagt.:


> Der Start wird ja wohl sein:
> 
> ```
> public class GeradeZahl {
> ...


Ja gut, so weit bin ich auch , aber mehr habe ich wirklich nicht. Ich weiß leider bei der Aufgabe überhaupt nicht wie ich vorgehen soll.


----------



## Mart (3. Jan 2022)

wenn du eine Klasse hast die gerade Zahl speichern sollte, und du darfst ungerade speichern.. läuft dann nicht irgendwas kehrvert?


----------



## PROGbeginner98 (3. Jan 2022)

Mart hat gesagt.:


> wenn du eine Klasse hast die gerade Zahl speichern sollte, und du darfst ungerade speichern.. läuft dann nicht irgendwas kehrvert?


ja, das macht natürlich keinen Sinn. Aber mich so richtig auf die Praxissprünge bringen tut es das leider nicht :S.
Vielleicht sollte ich erwähnen das ich vor kurzem erst mit programmieren begonnen habe^^.


----------



## fhoffmann (3. Jan 2022)

Die Klasse muss ein Member haben, in der sich die Zahl gemerkt wird.
Und sie sollte möglicherweise einen Konstruktor haben, in dem die aktuelle Zahl gesetztz wird-  also:

```
public class GeradeZahl {
   int aktuelleZahl;
   public GeradeZahl(int zahl) {
      // falls zahl ungerade ist, Exception werfen
      // ansonsten, zahl an aktuelleZahl zuweisen
   }
   // Methoden add() und multiply()
}
```


----------



## PROGbeginner98 (3. Jan 2022)

fhoffmann hat gesagt.:


> Die Klasse muss ein Member haben, in der sich die Zahl gemerkt wird.
> Und sie sollte möglicherweise einen Konstruktor haben, in dem die aktuelle Zahl gesetztz wird-  also:
> 
> ```
> ...


Danke, aber entweder denke ich zu kompliziert oder ich raff einfach nicht wie ich da in der Praxis vorgehen muss.


----------



## kneitzel (3. Jan 2022)

Bezügich dem punkt mit der Exception: Wenn irgendwas passiert, was nicht sein sollte, dann kann eine Exception geworfen werden (throw). An anderen Stellen kann so eine Exception gefangen werden (try / catch), aber das muss nicht zwingend sein.

Bei Exceptions gibt es dann zwei Arten: Checked Exceptions und Runtime (unchecked) Exception. Diese beiden Arten solltest Du einmal nachschlagen.

Wenn Du nun in der Klasse GeradeZahl feststellst, dass die Zahl nicht gerade ist: Das ist dann doch etwas, was nicht sein sollte -> Also hast Du da eine Exception zu werfen.

Und das ist dann etwas, das @fhoffmann auch in dem Kommentar im Konstruktor geschrieben hat.

Bezüglich der Methoden add und multiply:
1. Überlege Dir, was diese Methoden machen sollen.
2. Überlege Dir, was als Eingabe notwendig ist.
3. Überlege Dir, was als Ergebnis heraus kommen soll.
==> Nun überlege Dir, wie Du sowas machen kannst. Stell Dir dazu einfach vor, du hättest die Eingabe auf einem Zettel stehen: Was für Schritte musst Du machen um zu dem Ergebnis zu kommen? (Also mit Stift und Papier überlegen, wie das gehen könnte).

Wenn Du das alles soweit zusammen hast, dann kannst Du die Methode schreiben.


----------



## Mart (3. Jan 2022)

hattest du den Ausdruck



> throw new Exception("Da is ne Exception passiert");


schon?
wenn nicht solltest du das mal anschauen


----------



## fhoffmann (3. Jan 2022)

PROGbeginner98 hat gesagt.:


> Danke, aber entweder denke ich zu kompliziert oder ich raff einfach nicht wie ich da in der Praxis vorgehen muss.


Wahrscheinlich denkst du wirklich zu kompliziert.
Fange doch einach mit dem an, was ich dir vorgegeben habe.
Und dann arbeite dich langsam voran; zum Beispiel mit einem Testcode:

```
public class TestGeradeZahl {
  public static void main(Sring[] args) {
    GeradeZahl geradeZahl = new GeradeZahl(22); // 23
  }
}
```


----------



## PROGbeginner98 (3. Jan 2022)

fhoffmann hat gesagt.:


> Wahrscheinlich denkst du wirklich zu kompliziert.
> Fange doch einach mit dem an, was ich dir vorgegeben habe.
> Und dann arbeite dich langsam voran; zum Beispiel mit einem Testcode:
> 
> ...


okay im Endeffekt habe ich es jetzt so übernommen, die Main Klasse hier und die Subklasse von eben. Ich bin jetzt der Meinung, da muss jetzt ein if rein wo ich die teste ob die zahl gerade oder ungerade ist. Wie ich es jetzt aber aufschreibe ..?..


----------



## Mart (3. Jan 2022)

PROGbeginner98 hat gesagt.:


> Ich bin jetzt der Meinung, da muss jetzt ein if rein wo ich die teste ob die zahl gerade oder ungerade ist


das hört sich doch schon gut an .. wie du es aufschreibst nunja es ist dien Code.. mach mal


----------



## fhoffmann (3. Jan 2022)

PROGbeginner98 hat gesagt.:


> da muss jetzt ein if rein wo ich die teste ob die zahl gerade oder ungerade ist


Wie du das testest, wurde dir doch bereits in der ersten Antwort beschrieben:


M.L. hat gesagt.:


> gerade Zahlen haben einer Rechnung "modulo 2" die Null als Ergebnis.


----------



## PROGbeginner98 (4. Jan 2022)

So, ich habe mich mit frischem Gedanken ran gesetzt und das hier nun herausbekommen:

*Mein Konstruktor:*

package GeradeZahl;

import java.util.Scanner;

public class GeradeZahl
{
    public static int GeradeZahl() 
    {
        Scanner scanner = new Scanner(System.in);
        int aktuelleZahl = scanner.nextInt();
            if(aktuelleZahl % 2 == 0)
            {
                return aktuelleZahl;
            }
            else
            {
                return (aktuelleZahl-1);
            }

    }
        public static int addiere(int zahl1, int zahl2)
    {
        int ergebnis = zahl1 + zahl2;
        return ergebnis;
    }

public static int multipliziere(int zahl1, int zahl2)
    {
        int ergebnis = zahl1 * zahl2;
        return ergebnis;
    }    
}

*MeinIO Klasse:*

package Utilities;

public class MeinIO {
    public static void ausgabe(String text)
    {
        System.out.println(text);
    }
}


*Und die Main Klasse:*
package testgeradezahl;

import GeradeZahl.GeradeZahl;
import Utilities.MeinIO;

public class TestGeradeZahl {
  public static void main(String[] args) {
    MeinIO.ausgabe("Bitte geben Sie zwei Zahlen ein!");
    int ErsteZahl = GeradeZahl.GeradeZahl();
    int ZweiteZahl = GeradeZahl.GeradeZahl();
    MeinIO.ausgabe("Zahl 1 lautet: " + ErsteZahl + " \n\r");
    MeinIO.ausgabe("Zahl 2 Lautet: " + ZweiteZahl + " \n\r");
    MeinIO.ausgabe(ErsteZahl + " + " + ZweiteZahl + " = "+ GeradeZahl.addiere(ErsteZahl, ZweiteZahl) + " \n\r");
    MeinIO.ausgabe(ErsteZahl + " * " + ZweiteZahl + " = "+ GeradeZahl.multipliziere(ErsteZahl, ZweiteZahl) + " \n\r");
  }
}

Er gibt jetzt immer nur eine gerade Zahl aus, allerdings arbeite ich überhaupt nicht mit Exceptions. 
Würdet ihr das als Spaghetticode bezeichnen oder ist das so in ordnung?


----------



## PROGbeginner98 (4. Jan 2022)

PROGbeginner98 hat gesagt.:


> So, ich habe mich mit frischem Gedanken ran gesetzt und das hier nun herausbekommen:
> 
> *Mein Konstruktor:*
> 
> ...


Die Formatierung hier bekomme ich nicht gut hin ..


----------



## Mart (4. Jan 2022)

du musst beim nachrichten schreiben links oben vom chat fesnter das zeichen </> drücken da kannst du code rein schreiben


----------



## PROGbeginner98 (4. Jan 2022)

[CODE lang="java" title="MeinIO"]package Utilities;

public class MeinIO {
    public static void ausgabe(String text)
    {
        System.out.println(text);
    }
}[/CODE]
[CODE lang="java" title="Konstruktor"]package GeradeZahl;
/**
 * Dieses Programm ist mein Konstruktor. Dank dieser Klasse ist es
 * möglich meine eigenen Zahlen einzugeben. Die Zahlen sind aufgrund
 * des return statements in Zeile 21 immer gerade Zahlen.
 */
import java.util.Scanner;

public class GeradeZahl
{
    public static int GeradeZahl()
    {
        Scanner scanner = new Scanner(System.in);
        int aktuelleZahl = scanner.nextInt();
            if(aktuelleZahl % 2 == 0)
            {
                return aktuelleZahl;
            }
            else
            {
                return (aktuelleZahl-1);
            }

    }
        /**
         * hier findet die Addition und Multiplikation statt.
         * @param zahl1
         * @param zahl2
         * @return
         */
        public static int addition(int zahl1, int zahl2)
    {
        int ergebnis = zahl1 + zahl2;
        return ergebnis;
    }

public static int multiplikation(int zahl1, int zahl2)
    {
        int ergebnis = zahl1 * zahl2;
        return ergebnis;
    }   
}[/CODE]
[CODE lang="java" title="Main Klasse"]package testgeradezahl;
/**
 * Hier befindet sich das Main Programm.
 * Ich Importiere MeinIO und die Klasse GeradeZahl
 * um meine eigenen Zahlen eingeben zu können.
 * Weiter unten Addiere ich diese dann eingegebenen Zahlen
 * und Multipliziere diese ebenfalls. Beide Zahlen können
 * nur gerade sein, also kann auch das Ergebnis nur gerade sein.
 */
import GeradeZahl.GeradeZahl;
import Utilities.MeinIO;

public class TestGeradeZahl
{
  public static void main(String[] args)
  {
    MeinIO.ausgabe("Bitte geben Sie zwei Zahlen ein!");
    int ErsteZahl = GeradeZahl.GeradeZahl();
    int ZweiteZahl = GeradeZahl.GeradeZahl();
    MeinIO.ausgabe("Zahl 1 lautet: " + ErsteZahl + " \n\r");
    MeinIO.ausgabe("Zahl 2 Lautet: " + ZweiteZahl + " \n\r");
    MeinIO.ausgabe(ErsteZahl + " + " + ZweiteZahl + " = "+ GeradeZahl.addition(ErsteZahl, ZweiteZahl) + " \n\r");
    MeinIO.ausgabe(ErsteZahl + " * " + ZweiteZahl + " = "+ GeradeZahl.multiplikation(ErsteZahl, ZweiteZahl) + " \n\r");
  }
}[/CODE]


----------



## PROGbeginner98 (4. Jan 2022)

Mart hat gesagt.:


> du musst beim nachrichten schreiben links oben vom chat fesnter das zeichen </> drücken da kannst du code rein schreiben


Erledigt! 
Über feedback wäre ich sehr dankbar. Meinst du/ihr das es so in ordnung ist?


----------



## Mart (4. Jan 2022)

da sich deine aufgabe um fehler werfen und behandeln sollte denke ich dass die zeile

```
return (aktuelleZahl-1);
```
nicht in ordnung ist , hier sollte ein fehler geworfen werden es ist schlichtweg keine gerade zahl => input war falsch

außerdem du übergibst als nutzer der klasse ein array mit 100 zahlen und plötzlich haben sich 50 zahlen geändert und der benutzer deiner klasse weis nicht warum und niemand schaut nach weil man da wahnsinnig wird wenn man alle klassen nach lesen muss... deswegen darfst du eher kein "unerwartetes verhalten" einbauen

zb.
wenn du eine Methode stringZusammenFügen schreibst das zwei strings akzeptiert und du die Strings mit einem Leerzeichen zusammenbaust dann rechnet niemand damit dass da ein Leerzeichen rein kommt => unerwartetes verhalten vermeiden


----------



## kneitzel (4. Jan 2022)

Habt Ihr schon Klassen verwendet? Um dann Instanzen davon zu erzeugen?

Das wäre meine Erwartung bei der Aufgabe gewesen. Und die Methoden wären dann Instanzmethoden, d.h. Du hast dann Code wie:

```
public class TestGeradeZahl
{
  public static void main(String[] args)
  {
      GeradeZahl zahl1 = new GeradeZahl(2);
      GeradeZahl zahl2 = new GeradeZahl(10);
      GeradeZahl summe = zahl1.add(zahl2);
  }
}
```

Bei Dir stört mich sonst am Code einiges. Methoden sagen, was sie machen. Eine Methode wie:

```
public class GeradeZahl
{
    public static int GeradeZahl() {
        // ...
    }
    
    // ....
}
```
lässt mich ehrlich gesagt etwas schaudern. Eine Methode sollte nur so heißen wie die Klasse, wenn es ein Konstruktor ist. Das ist so extrem verwirrend.
Eine Methode sollte ein Verb enthalten und aussagen, was diese Klasse macht (also etwas wie add, delete, get, ...)
Dann fangen Methoden mit einem kleinen Buchstaben an! Variablen fangen mit einem kleinen Buchstaben an.

Das in der Aufgabe eine Exception verlangt wurde, wurde ja auch schon erwähnt.


----------



## M.L. (4. Jan 2022)

Wg. einer Exception und (un)geraden Eingaben kann man sich an diesen Beispiel unter Stackoverflow orientieren: https://stackoverflow.com/questions...r-and-giving-exception-error-if-number-is-odd


----------



## PROGbeginner98 (4. Jan 2022)

kneitzel hat gesagt.:


> Habt Ihr schon Klassen verwendet? Um dann Instanzen davon zu erzeugen?
> 
> Das wäre meine Erwartung bei der Aufgabe gewesen. Und die Methoden wären dann Instanzmethoden, d.h. Du hast dann Code wie:
> 
> ...


Okay den Code habe ich noch etwas überarbeitet. Hier weiß ich nur leider nicht wie ich das in dieser Weise ausführen soll, ich bekomme immer Fehler. Und es sieht für mich so aus als würde man dann wieder feste Zahlen haben, oder?



Mart hat gesagt.:


> da sich deine aufgabe um fehler werfen und behandeln sollte denke ich dass die zeile
> 
> ```
> return (aktuelleZahl-1);
> ...


Da du ja sicher weißt wie ich das vernünftig ändern kann, könntest du mir das eventuell sagen?


----------



## temi (4. Jan 2022)

PROGbeginner98 hat gesagt.:


> Da du ja sicher weißt wie ich das vernünftig ändern kann, könntest du mir das eventuell sagen?


Löse eine Exception aus. Stichwort ist "throws", das wurde weiter oben schon mal erwähnt.


----------



## Mart (4. Jan 2022)

PROGbeginner98 hat gesagt.:


> Da du ja sicher weißt wie ich das vernünftig ändern kann, könntest du mir das eventuell sagen?


aber wenn ich dir die lösung sage weist du es beim zweiten mal ja wieder nicht, außerdem hab ich sie dir schon gesagt in einem vorherigen post


----------



## kneitzel (4. Jan 2022)

PROGbeginner98 hat gesagt.:


> Okay den Code habe ich noch etwas überarbeitet. Hier weiß ich nur leider nicht wie ich das in dieser Weise ausführen soll, ich bekomme immer Fehler. Und es sieht für mich so aus als würde man dann wieder feste Zahlen haben, oder?


Also da wäre die Frage, was Du wie überarbeitet hast und was für Fehler Du im Detail bekommst. 

Die Hilfe hier ist immer gedacht als eine Hilfe zur Selbsthilfe. Du sollst lernen, wie Du so Aufgaben selbständig lösen kannst. Daher werden wir Dir keine Lösung vorgeben sondern immer nur versuchen, Dich in die richtige Richtung zu schubsen.

Daher wäre wirklich die Frage, mit was für Materialien Du Dir dies erarbeitest. So Unterricht/Vorlesungen nicht ausreichen, dann wäre mein Vorschlag immer ein gutes Buch. An Einsteigerbüchern wird hier oft "Java von Kopf bis Fuss" und "Schrödinger lernt Java" genannt.
Im Netz gibt es frei das Buch "Java ist auch eine Insel", die als Nachschlagewerk super ist, aber als Grundlage um sich selbst etwas anzueignen evtl. nicht ganz so gut ist (Aber Nachschlagen reicht evtl. ja auch aus und ist alles, was Du brauchst).

So ließe sich da das Werfen einer Exception auch nachlesen:


			Ausnahmen mÃ¼ssen sein


----------



## PROGbeginner98 (4. Jan 2022)

```
public class GeradeZahl extends Exception
{
    public static int rechnen()
    {
        Scanner scanner = new Scanner(System.in);
        int aktuelleZahl = scanner.nextInt();
            if(aktuelleZahl % 2 == 0)
            {
                //return aktuelleZahl;
            }
            else
            {   
                //return (aktuelleZahl);
                throw new IllegalArgumentException("Es können nur gerade Zahlen ausgegeben werden!");
            }
        return aktuelleZahl;
    }
    try
    {
        
    }
        /**
         * hier findet die Addition und Multiplikation statt.
         * @param zahl1
         * @param zahl2
         * @return
         */
        public static int add(int zahl1, int zahl2)
    {
        int ergebnis = zahl1 + zahl2;
        return ergebnis;
    }
        
public static int multi(int zahl1, int zahl2)
    {
        int ergebnis = zahl1 * zahl2;
        return ergebnis;
    }   
}
```


----------



## PROGbeginner98 (4. Jan 2022)

PROGbeginner98 hat gesagt.:


> ```
> public class GeradeZahl extends Exception
> {
> public static int rechnen()
> ...


okay, hier bleibe ich stecken und weiß nicht wie ich weiter gehen soll.


----------



## Mart (4. Jan 2022)

ein throw kann ein Return ersetzen dh wenn du throw hast brauchst du kein return mehr ( an dieser Stelle ) es wird als diese behandelt


----------



## kneitzel (4. Jan 2022)

Hast Duch denn schon mal mir dem erstellen einer Klasse beschäftigt?
So dass eine Klasse Instanzvariablen hat, einen oder mehrere Konstruktoren und Instanzmethoden?

Das, was du da bisher hast hat bisher kaum etwas mit der Aufgabe zu tun fürchte ich.


PROGbeginner98 hat gesagt.:


> Schreiben Sie Methoden für die Addition und Multiplikation dieser Klasse


Die Methoden sollen also diese Klasse (GeradeZahl) addieren oder multiplizieren und keine int.

Da solltest Du Dir dringend die Grundlagen noch einmal ansehen.


----------



## PROGbeginner98 (4. Jan 2022)

kneitzel hat gesagt.:


> Hast Duch denn schon mal mir dem erstellen einer Klasse beschäftigt?
> So dass eine Klasse Instanzvariablen hat, einen oder mehrere Konstruktoren und Instanzmethoden?
> 
> Das, was du da bisher hast hat bisher kaum etwas mit der Aufgabe zu tun fürchte ich.
> ...


Das ist tatsächlich einer Demotivation näher als einer Hilfe, aber vielen Dank trotzdem.


----------



## Mart (4. Jan 2022)

wenn du eine methode static machst gehört diese zur klasse, wenn sie nicht static sind gehören sie zu objekten

dh eine KLasse ist dein bauplan
wenn du es nicht static machst hat alles was du gebaut hast die eigenschaften des bauplans aber du musst erstmal was bauen


----------



## temi (5. Jan 2022)

PROGbeginner98 hat gesagt.:


> Das ist tatsächlich einer Demotivation näher als einer Hilfe, aber vielen Dank trotzdem.


Ein Problem ist es, dass wir nicht wissen können, was du bereits gelernt hast und was nicht. Also üblicherweise werden Instanzen von Klassen erzeugt und im weiteren Programm mit diesen Instanzen gearbeitet. In dem Fall ist es selten notwendig, dass man das Schlüsselwort "static" verwenden muss. Als Faustregel kannst du mal annehmen, dass das einzige static vor der main-Methode stehen sollte.

Beispiel:

```
class Auto {
    String marke;
 
    Auto(String marke) {
        this.marke = marke;
    }
}

// in der Main Methode

Auto auto = new Auto("Jaguar"); // erzeugt eine Instanz der Klasse Auto und weist sie einer Variablen zu
```

Frage: Verwendet ihr Klassen in dieser Weise oder nicht?

Falls ja, dann ist auch klar, wie du mit deiner Klasse arbeiten sollst
[CODE lang="java" title="von @kneitzel geliehen"]GeradeZahl zahl1 = new GeradeZahl(2);
GeradeZahl zahl2 = new GeradeZahl(10);
GeradeZahl summe = zahl1.add(zahl2);

GeradeZahl ungueltig = new GeradeZahl(3); // muss eine Exception werfen[/CODE]
In dem Fall sollte es keine "static" in deiner Klasse geben...


----------



## kneitzel (5. Jan 2022)

PROGbeginner98 hat gesagt.:


> Das ist tatsächlich einer Demotivation näher als einer Hilfe, aber vielen Dank trotzdem.


Es war nicht meine Absicht zu demotivieren. Aber bitte verstehe, dass es existenziell ist, hier schneller in die Materie rein zu kommen. Welche Punkte Du als nächstes dringend aufarbeiten solltest, habe ich daher angegeben.


kneitzel hat gesagt.:


> Hast Duch denn schon mal mir dem erstellen einer Klasse beschäftigt?
> So dass eine Klasse Instanzvariablen hat, einen oder mehrere Konstruktoren und Instanzmethoden?


Das Problem dabei ist leider auch: Das ist erst der Anfang. Du wirst noch über die eine oder andere Hürde stolpern fürchte ich. Daher ist das nur ein weiterer Zwischenschritt. Daher auch die Frage in #28 nach den Arbeitsmitteln: Wie erarbeitest Du Dir fehlendes Wissen? Das ist ein wichtiger Punkt um hier evtl. noch weiter vorran zu kommen (und ggf. auch schneller - Du wirst die Aufgabe ja bis zu einem bestimmten Zeitpunkt fertig haben sollen. Erfahrungsgemäß rechnet eine Hochschule bei solchen Aufgaben nicht in Wochen.) Und bitte nicht vergessen: Das ist keine Abschlussarbeit, die jetzt fertig werden muss und dann bist Du fertig. Es geht hier um eine einfache Übung, bei der zwei kleine Grundlagen abgefragt werden: Halt das schreibene iner einfachen Klasse und das Werfen einer Exception. Dabei wird es garantiert nicht bleiben und ihr werden weitere Inhalte bekommen, die auf diesen Grundlagen basieren werden.Ziel ist daher, dass Du das notwendige Wissen erwirbst - und das wenn möglich auch schnell.

Daher lass mich meine Fragestellung aus #28 noch einmal wiederholen:


kneitzel hat gesagt.:


> Daher wäre wirklich die Frage, mit was für Materialien Du Dir dies erarbeitest. So Unterricht/Vorlesungen nicht ausreichen, dann wäre mein Vorschlag immer ein gutes Buch. An Einsteigerbüchern wird hier oft "Java von Kopf bis Fuss" und "Schrödinger lernt Java" genannt.
> Im Netz gibt es frei das Buch "Java ist auch eine Insel", die als Nachschlagewerk super ist, aber als Grundlage um sich selbst etwas anzueignen evtl. nicht ganz so gut ist (Aber Nachschlagen reicht evtl. ja auch aus und ist alles, was Du brauchst).


Kann man Dir hier ggf. noch weitere Unterstützung zukommen lassen? Studieren ist auch ein "Lernen zu lernen". Ich will Dich nicht demotivieren sondern lediglich dazu in die Lage versetzen, dass Du in Deinem Studium vorran kommst (Und das ist nicht die Lösung der Aufgabe. Wenn Du das glauben solltest, dann klatsche ich Dir die Lösung gerne hier hin. Aber das wäre aus meiner Sicht ein Torpedieren Deines Studiums. Der kurzzeitige Erfolg "Hurra, ich habe eine Lösung für diese Aufgabe" wird sehr schnell zu einer Position führen, dass Du Aufgaben bewältigen sollst, die deutlich komplexer sind und das Wissen dieser Aufgabe als selbstverständlich ansehen. Und das nicht nur in diesem Fach. Darauf werden auch noch andere Fächer aufbauen, so Du eine Studienrichtung der Informatik studieren solltest.



temi hat gesagt.:


> Frage: Verwendet ihr Klassen in dieser Weise oder nicht?


Ich fürchte ja, dass die Aufgabe dies mit ihrer Formulierung bereits beantwortet hat:


> -Schreiben Sie eine Klasse GeradeZahl.
> -Schreiben Sie Methoden für die Addition und Multiplikation* dieser Klasse.*
> -Sichern Sie mit geeigneten Ausnahmen, dass *eine GeradeZahl* auch stets eine gerade Zahl ist.


Das ist ja kein "schreiben sie Methoden für die Addition und Multiplikation von Zahlen." und "Sichern sie mit geeigneten Ausnahmen, dass die Zahlen, mit denen gearbeitet wird, auch stets gerade Zahlen sind.". Mit dieser Gegenüberstellung wird das hoffentlich deutlich.


----------



## temi (5. Jan 2022)

kneitzel hat gesagt.:


> Ich fürchte ja, dass die Aufgabe dies mit ihrer Formulierung bereits beantwortet hat


Ich meinte eher, ob sie Instanzen von Klassen erzeugen oder ob sie "noch" alles mit statischen Methoden machen (ich hoffe nicht). Oder hab ich dich falsch verstanden?


----------



## kneitzel (5. Jan 2022)

temi hat gesagt.:


> Ich meinte eher, ob sie Instanzen von Klassen erzeugen oder ob sie "noch" alles mit statischen Methoden machen (ich hoffe nicht). Oder hab ich dich falsch verstanden?


Meine Interpretation mag falsch sein, aber ich verstehe es so, dass die Aufgabenstellung ja fordert, dass GeradeZahl Instanzen addiert / multipliziert werden sollen. Und das funktioniert nur mit Instanzen der Klasse. Oder eben der Dritte Punkt: Da geht es ja darum, dass sicher gestellt werden soll, dass eine GeradeZahl (Instanz) immer eine gerade Zahl ist.

Ob die Methoden nun statisch sind als Utility Methoden oder nicht oder ob GeradeZahl immutable ist oder nicht: Das dürften Freiheitsgrade sein in der Aufgabe - so eben keine klaren Aussagen z.B. in der Vorlesung diesbezüglich gemacht wurden.

Das sollte auch in keiner Weise gegen Deine Frage gehen - es ist wichtig, dass die Aufgabe als solche wirklich verstanden wird und vielleicht lese ich da etwas aus der Aufgabenstellung heraus, das Du mit Deinen Erfahrungen nicht daraus ableiten würdest. Und letztendlich fällt mir gerade auf, dass deine Frage auch so gedacht sein könnte, dass sie den TE in die richtige Richtung pushen soll. Er denkt darüber nach und kommt dann selbst auf die notwendigen Antworten / Erkenntnisse. (Sorry, wenn ich dann Deine Bemühungen durchkreuzt haben sollte).


----------



## temi (5. Jan 2022)

Ohne Rückmeldung des TE, ist jedes weitere geschriebene Wort sinnlos. Wir können es nicht wissen, wir waren ja nicht dabei.


----------



## PROGbeginner98 (5. Jan 2022)

kneitzel hat gesagt.:


> Daher lass mich meine Fragestellung aus #28 noch einmal wiederholen:
> 
> Kann man Dir hier ggf. noch weitere Unterstützung zukommen lassen? Studieren ist auch ein "Lernen zu lernen". Ich will Dich nicht demotivieren sondern lediglich dazu in die Lage versetzen, dass Du in Deinem Studium vorran kommst (Und das ist nicht die Lösung der Aufgabe. Wenn Du das glauben solltest, dann klatsche ich Dir die Lösung gerne hier hin. Aber das wäre aus meiner Sicht ein Torpedieren Deines Studiums. Der kurzzeitige Erfolg "Hurra, ich habe eine Lösung für diese Aufgabe" wird sehr schnell zu einer Position führen, dass Du Aufgaben bewältigen sollst, die deutlich komplexer sind und das Wissen dieser Aufgabe als selbstverständlich ansehen. Und das nicht nur in diesem Fach. Darauf werden auch noch andere Fächer aufbauen, so Du eine Studienrichtung der Informatik studieren solltest.


Ich bin tatsächlich über jede Hilfe froh und über Anregungen, wie ich schneller und effektiver Java lernen kann. Zum Verständnis meiner Situation:
Ich bin Quereinsteiger und habe keine Programmiererfahrungen und habe nun angefangen Technische Informatik zu Studieren. Ich befinde mich im ersten Semester und der Dozent hat dank Corona die Vorlesungen extrem schnell durchgezogen, damit wir die eigentliche Theorie in Präsenz erledigen. Dabei blieb natürlich nicht all zu viel hängen und auch die Kapitel 8 bis 10, welche die letzten sind, sollten selbstständig erarbeitet werden, weshalb ich keine Auskunft des Dozenten zu dieser Aufgabe habe. Es tut mir also leid, das ich wenig darüber erzählen kann, wie diese Aufgabe gemeint ist.
Ich bin auch einer der wenigen die wirklich keine Erfahrungen haben, welche die, die Erfahrungen haben, sagen mir nur "viel glück". 

Da es sich doch tatsächlich um die Entwicklungsklausur handelt, bin ich doch ziemlich unter Zeitdruck. Freitag ist der Abgabetag und MIR fehlt nur noch diese Aufgabe. Warum ich "mir" groß geschrieben habe ist, weil ich diese Arbeit nicht alleine durchführe sondern in einer zweiergruppe. Derjenige ist jedoch mit einer anderen Aufgabe beschäftigt. (Ja, es ist erlaubt diese Aufgaben zusammen zu machen, da er zwar die gesamten Aufgaben kontrolliert, aber die eigentliche Prüfung ende Januar stattfindet, in mündlicher Form. (dank Corona)).
Ich bin aktuell ziemlich überfordert und sehe wenig Chancen, daher wäre ich über jede Hilfe oder Lektüre Empfehlungen dankbar.


----------



## kneitzel (5. Jan 2022)

Also Freitag ist ein sehr enger Zeitrahmen - aber die Bücher sind zumindest in Englischer Sprache z.B. bei oreilly Learning verfügbar. Daher evtl. da einmal die Probezeit anstoßen.

Das empfohlene Buch wäre da "Java von Kopf bis Fuß" bzw. falls das auf Deutsch nicht verfügbar ist: "Head First Java" (Autoren Kathy Sierra)
Meine Empfehlung wäre, dieses Buch schnellstmöglich durchzuarbeiten um ein Verständnis von Java zu bekommen.

Da Du noch keine Erfahrungen hast: Es gibt ein neues Buch vom Autoren des Buches "Java ist auch eine Insel": "Captain Ciaciao erobert Java" von Christian Ullenboom (@Ullenboom) - das wäre ein Praxisbuch also Aufgaben mit Musterlösungen. Das wäre aber dann natürlich eine mittelfristige Lösung.

Eine weitere Möglichkeit um in den verbliebenen wenigen Tagen die Aufgabe zu lösen:
Java von Kopf bis Fuß ist ein gutes Online Nachschlagewerk. Die Aufgabe kann man etwas zerlegen und dann mit Links aus dem Buch erarbeiten.

Ein ganz wichtiger Link ist die Beschreibung des Java Frameworks: https://docs.oracle.com/en/java/javase/17/docs/api/index.html
Da kannst Du klassen / Methoden / packages ... über das Suchfeld schnell aufrufen! => Das einmal direkt ausprobieren ob das funktioniert!



PROGbeginner98 hat gesagt.:


> -Schreiben Sie eine Klasse GeradeZahl.





			Imperative Sprachkonzepte
		



			Eigene Klassen schreiben
		


-> So eine GeradeZahl muss natürlich einen Wert speichern. Dazu dienen dann Instanzvariablen.
-> Konstruktor: Dem muss dann der Wert mitgegeben werden und der Konstruktor setzt dann die (Instanz-)Variable
-> Instanzvariablen sind in der Regel private - von außen sind diese nicht sichtbar und können von außen nicht geändert werden!
==> Das ist im ganzen Kapitel 6 beschrieben ... 



PROGbeginner98 hat gesagt.:


> -Schreiben Sie Methoden für die Addition und Multiplikation dieser Klasse.





			Eigene Klassen schreiben
		

Hier ist dann wichtig, dass man sich überlegt, was man da genau machen möchte. Ein üblicher Ansatz, wie man ihn z,B. bei der Klasse BigInteger nachschlagen kann, ist:
public BigInteger add(BigInteger val)

Die Methode ist nicht static, wird also auf einer Instanz aufgerufen und bekommt eine Instanz als Parameter übergeben. Das Ergebnis landet aber nicht in einer dieser Instanzen sondern es wird eine neue Instanz von BigInteger zurück gegeben. Daran kann man sich dann auch für GradeZahl orientieren.



PROGbeginner98 hat gesagt.:


> -Sichern Sie mit geeigneten Ausnahmen, dass eine GeradeZahl auch stets eine gerade Zahl ist.


Hier ist jetzt der Konstrukor anzupassen. Wenn ein Wert übergeben wurde, der nicht gerade ist, dann soll eine geeignete Ausnahme passieren. Ausnahmen: https://openbook.rheinwerk-verlag.de/javainsel/08_001.html#u8
Speziell das Auslösen von Exceptions: https://openbook.rheinwerk-verlag.de/javainsel/08_006.html#u8.6

Jetzt ist die Frage, was geeignet wäre und da kann man sich ja anschauen, was es so an Exceptions gibt. Wenn du das Kapitel 8 ganz gelesen hast, dann wirst du zwei Kategorien kennen und ich greife da mal vorweg: Eine RuntimeException ist sinnvoll. Wenn Du die in dem Dokumentationslink aufrufst, dann siehst Du auch alle abgeleiteten Klassen. Und da kannst Du mal schauen, was sich evtl. gut anhört (auch die Dokumentation lesen!) ... Evtl. findest Du ja eine Exception, die angibt, dass ein Parameter ungültig ist...

Dann muss man auch noch schauen: Die Methoden, die wir geschrieben haben: Ist da auch eine Prüfung notwendig? Was für Gedanken kommen Dir da?

Damit wäre dann die Aufgabe gelöst.

Also ganz kurzfristig kannst Du schauen, ob das mit der Java ist auch eine Insel ein Weg ist, den Du schaffst jetzt zu gehen. Oder ob es so weit reicht, dass Du konkrete Verständnisprobleme hier erfragen kannst. Ansonsten ganz klar die Aufforderung, dich das intensiv mit zu beschäftigen - Bücher habe ich genannt. Eins zum lernen und auch eins zur Überprüfung / für Praxis! Da ist die dringende Empfehlung, da Zeit zu investieren um Dinge aufzuarbeiten. Deine Situation ist extrem schwer und wir werden Dir hier helfen. Aber die Hilfe geht immer darum, dass Du fehlendes Wissen bekommst - Prüfungen und so kommen halt im Studium auch und das willst Du ja alles schaffen 

Ich hoffe, das war hilfreich. Fragen / Probleme immer direkt stellen - dann sehe ich da prinzipiell kein wirkliches Problem (außer dass es Dich viel Zeit und Mühe kosten wird natürlich ... aber ich bin sicher: Du kannst das packen!)


----------



## M.L. (5. Jan 2022)

PROGbeginner98 hat gesagt.:


> wie diese Aufgabe gemeint ist.


Für die Antwortenden dürfte es einfacher sein zu erfahren WOMIT diese Aufgabe bearbeitet werden kann/darf/soll/...: statische Methoden, Klassenmethoden,  (Input)Exception, Aufteilung auf eine oder mehrere Dateien, Scanner,...
Grundsätzlich sind in Java aber diverse Formalismen und (Code)Konventionen einzuhalten, z.B. nur eine "static main"-Methode zu verwenden (static ist nicht per se böse, kommt auf die Menge an)


----------



## kneitzel (5. Jan 2022)

PROGbeginner98 hat gesagt.:


> Es tut mir also leid, das ich wenig darüber erzählen kann, wie diese Aufgabe gemeint ist.


Das ist ein Punkt, der auch nicht wirklich vertieft werden muss.
Zumindet ich habe eine genaue Vorstellung, denn die von Dir gebrachte Aufgabenstellung hat gewisse Aussagen mit drin. Und nach meienr Erfahrung (ok, die ist deutlich über 20 Jahre her) hat eine Hochschule kein "Wir lernen ein Semester lang eine Sprache" sondern das ist etwas, das sich Studenten schnell aneignen sollen. Also nichts mit "Klassen hatten wir noch nicht, die kommen erst nächste Woche". Das Thema Java wird daher vermutlich abgeschlossen sein um dann schnell zum eigentlichen Punkt zu kommen (Vermutlich Algorithmen und Datenstrukturen - aber ist nur geraten und ist auch komplett egal).

Einen Lösungsansatz für die Gewinnung des Wissens für die Aufgabe und auch einen Lösungsansatz bezüglich "zu den anderen Studenten aufschließen" habe ich gebracht und ich hoffe, dass dies zielführend ist. Aber ich denke, darauf sollte man sich jetzt konzentrieren.


----------

