Aufgabe im Studium

StevenGG

Mitglied
Hallo zusammen,

ich lerne gerade Java und habe folgende Aufgabe, die ich lösen muss. Kann mir jemand bitte erklären wie bzw. was zutun ist?

In einem Java-Programm fur eine Tierarztpraxis soll das Alter von Hunden erfasst werden. Dazu konnte man eine Klasse ’Hund’ mit einer Instanzvariablen ’Alter’ vom Typ ’int’ anlegen. Der Computer erkennt dann aber nicht, wenn im Java-Programm dieser Variablen irrtumlich ein unzulassiger Wert, wie z.B. ’45’ zugewiesen werden wurde. Wie kann man diese Schwachstelle vermeiden? Implementieren Sie Ihre Losung zu diesem Problem.

Viele Grüße
 
Na das Erstellen einer Klasse und anlegen einer Instanzvariablen wird du doch wohl können.

In der setter Methode könntest du prüfen ob der übergabe Wert im richtigen Werte Bereich liegt.
Bevor du ihn in der Variablen speicherst. Wenn außerhalb Vileicht auch eine Fehlermeldung ausgeben.
 
WIe man es prüft, ist einfach. Wie du darauf reagieren willst, ist eine andere Sache.

Falls der Fehler zu einer Meldung führen soll, wäre eine mögliche Reaktion, eine OutOfBounds-Exception zu werfen, die dann extern behandelt werden muss.
Alternativ - falls der Wert automatisch mit der min/max Methode korrigiert werden soll - könnte der Setter per Boolean eine Rückmeldung liefern, ob der Wert korrigiert werden musste oder einfach den effektiv gesetzten Wert als Rückgabe liefern.
 
Für eine OutOfBounds-Exception
Ohne eine Grenze festgelegt zu haben würde die für eien int erst außerhalb
–2147483648 - +2147483647 kommen.
 
@Jw456
Mir ist schleierhaft, wie man einen Integerwert außerhalb von Integer.MIN_VALUE und Integer.MAX_VALUE überhaupt erstellen will.
Selbst wenn du einen Long-Wert nach (int) castest, wirst du keinen Wert außerhalb dieser Grenzen erhalten.
 
Na das Erstellen einer Klasse und anlegen einer Instanzvariablen wird du doch wohl können.

In der setter Methode könntest du prüfen ob der übergabe Wert im richtigen Werte Bereich liegt.
Bevor du ihn in der Variablen speicherst. Wenn außerhalb Vileicht auch eine Fehlermeldung ausgeben.
Hey Jw, ich habe mal was gebastelt. Entspricht es der oben genannten Anforderung der Aufgabe? :/

Java:
public class Hund{
 
  private int alter;

   public Hund(int alter){
    this.alter = alter;
   }

    public void setalter(int neuesalter){
        this.alter = neuesalter;
        if (alter<0 || alter>=30)
        System.out.println("Fehlerhafte Eingabe");
        else System.out.println(alter);}
            
}
 
Also zum einen ist im Konstruktor immer noch jedes Alter möglich.

Und bei Dir wird auch jedes Alter gesetzt. Es kommt dann nur noch eine Ausgabe.

Immer etwas nach der Aufgabe richten. Steht da etwas von einer Ausgabe? Wenn nicht, dann braucht man auch keine Ausgabe.

Wenn nur verhindert werden soll, dass ein zulässiger Wert gesetzt wird, dann kann man lediglich dieses Setzen prüfen. Das wäre dann also sowas:
Java:
    public void setAlter(int alter){
        if (alter<0 || alter>=30) return;
        
        this.alter = neuesalter;
    }

Bei einem ungültigen Alter wird also nichts gesetzt. Anforderung an der Stelle erfüllt. Aber man muss das ja irgendwie signalisieren. Da sind dann Exceptions der übliche Weg, also statt dem return dann ein throw new .....
 
Also zum einen ist im Konstruktor immer noch jedes Alter möglich.

Und bei Dir wird auch jedes Alter gesetzt. Es kommt dann nur noch eine Ausgabe.

Immer etwas nach der Aufgabe richten. Steht da etwas von einer Ausgabe? Wenn nicht, dann braucht man auch keine Ausgabe.

Wenn nur verhindert werden soll, dass ein zulässiger Wert gesetzt wird, dann kann man lediglich dieses Setzen prüfen. Das wäre dann also sowas:
Java:
    public void setAlter(int alter){
        if (alter<0 || alter>=30) return;
       
        this.alter = neuesalter;
    }

Bei einem ungültigen Alter wird also nichts gesetzt. Anforderung an der Stelle erfüllt. Aber man muss das ja irgendwie signalisieren. Da sind dann Exceptions der übliche Weg, also statt dem return dann ein throw new .....
Java:
Hund rex = new Hund(2);
rex.setalter(8421);

Welches Alter hat Rex jetzt?
Okay, also wäre theoretisch die Aufgabe mit dem Code von kneitzel erfolgreich erledigt, da es durch die return anweisung nicht zu dem "this.alter = neuesalter;" kommt und rex dürfe nicht das alter 8421 haben richtig?
 
Wie schon mehrfach gesagt wurde entweder im Konstruktor und setter prüfen.
Oder im Konstruktor keinen Wert übergeben der Variablen ein festes alter geben erst mal 0. Im Setter dann das Alter setzen mit prüfen.
Welche Variante du benutzt ist deine Sache.

Wenn der Konstrukteur oder eine andere Methode ein alter übergeben bekommt musst du es prüfen ob es im Bereich ist.
Wie weißt du ja nun.
 
Also mein Lösungsansatz wäre dann folgender code:

Java:
public class Hund{

  private int alter;

   public Hund(int alter){
    alter = 0;
   }

public void setAlter(int neuesalter){
        if (alter<0 || alter>=30) return;
        this.alter = neuesalter;
    }
}
 
wenn du einen festen Wert willst dann übergebe gar keinen Wert.
Kannst in diesem Fall auch den Standart lehren Konstruktor benutzen.
Der alter Variablen kannst du ja gleich das Alter 0 setzen beim erstellen.

Ob das mit der Aufgabenstellung zusammen passt musst du wissen.
 
Zuletzt bearbeitet:
Java:
public class Hund{ private int alter = 0;  public void setAlter(int neuesalter){ if (alter<0 || alter>=30) return; this.alter = neuesalter; } }
 
Also mein Lösungsansatz wäre dann folgender code:

Java:
public class Hund{

  private int alter;

   public Hund(int alter){
    alter = 0;
   }

public void setAlter(int neuesalter){
        if (alter<0 || alter>=30) return;
        this.alter = neuesalter;
    }
}
Bei dem Konstruktor wird derzeit - so wie von @mihe7 schon gesagt, der Parameter alter auf 0 gesetzt. Vermutlich willst Du den Konstruktor ohne Parameter haben.

Und bei der Methode hast Du den Parameter von alter in neuesalter zurück umbenannt. Dadurch prüfst Du nicht den Wert des Parameters sondern den Wert, der derzeit in der Instanzvariable geschrieben steht.
(Bei meinem Code war die Zuweisung aber auch falsch. Das hätte bei mir dann auch this.alter = alter; heißen müssen.

Wen der Parameter so heißt, wie eine Instanzvariable, dann wird die Instanzvariable versteckt. Sprich: im Konstruktor (aber auch bei meiner setAlter Methode) heisst ein Parameter alter. Die Instanzvariable kann man dann nur über die Instanz this erreichen. Daher dann das this.alter = alter.
 
Java:
public class Hund{ private int alter = 0;  public void setAlter(int neuesalter){ if (alter<0 || alter>=30) return; this.alter = neuesalter; } }
Vielen Dank erstmal für die schnellen und zahlreichen antworten 🙂
Ich gehe davon aus, dass diese Variante von Jw die Aufgabe vollständig und richtig erfüllt?
hier wird aber der Konstruktor ja leer gelassen, das heißt man brauch ihn nicht hinschreiben richtig?
 
Ich gehe davon aus, dass diese Variante von Jw die Aufgabe vollständig und richtig erfüllt?
Nein, Du solltest die Anregungen, die wir dir geben, verstehen und umsetzen. Das Verständnis der Punkte ist existenziell. Das musst Du verstehen, damit Du später nicht noch viel mehr Probleme bekommen wirst, weil Dir diese wichtigen Grundlagen fehlen.
hier wird aber der Konstruktor ja leer gelassen, das heißt man brauch ihn nicht hinschreiben richtig?
Wenn der Konstruktor nichts machen soll, dann braucht man keinen hin zu schreiben. Wenn kein Konstruktor vorhanden ist, dann erstellt Java einen default Konstruktor.
 
Nein, Du solltest die Anregungen, die wir dir geben, verstehen und umsetzen. Das Verständnis der Punkte ist existenziell. Das musst Du verstehen, damit Du später nicht noch viel mehr Probleme bekommen wirst, weil Dir diese wichtigen Grundlagen fehlen.

Wenn der Konstruktor nichts machen soll, dann braucht man keinen hin zu schreiben. Wenn kein Konstruktor vorhanden ist, dann erstellt Java einen default Konstruktor.
Okay verstehe, jedoch verstehe ich jetzt nicht was ich noch implementieren soll bzw, stehe auf dem Schlauch. Ich dachte mit dem Code erkennt der Computer, dass ein unzulässiger Wert hingeschrieben wurde.
 
Java:
public void setAlter(int neuesalter){ if (alter<0 || alter>=30) return; this.alter = neuesalter; }

Die Methode macht nicht das was du willst. Teste es im Debugger. Damit du drauf kommst was du falsch machst.


Habe dir eigentlich die Lösung schon genannt.


Tipp was passiert wenn das if true ist?
Was soll da eigentlich passieren?

Tipp zwei benutze die geschweiften Klammern da mit du siehst was bei true und was bei else (false) ausgeführt wird.
 
Zuletzt bearbeitet:
Java:
public class Hund {

    private int alter = 0;

  

    public Hund(int alter) {

      

        if (alter<0 || alter>=30)

        return;

        this.alter = alter;

    }

  

    public void setAlter(int alter)

    { if (alter<0 || alter>=30)

    return;

  

    this.alter = alter; }





public static void main (String[] args) {

Hund rex = new Hund(35);

rex.setAlter(35);



System.out.println(rex.alter);}

}

Ich habe diesen Code im Debugger durchgespielt und er setzt immer wenn ich die Main Methode ausführe wenn ein unzulässiges alter angegeben wird kein alter sondern behält die 0. Damit sollte jetzt alles richtig sein oder sehe ich das falsch 😀 ?
 
Mal abgesehen davon, dass Deine Formatierung an Körperverletzung grenzt: wenn Du den Code im Konstruktor und der Methode setAlter anschaust, wirst Du feststellen: oh, der ist ja identisch.

Also kannst Du im Konstruktor einfach setAlter(alter) aufrufen (um Schweinereien zu verhindern, müsste man die Methode setAlter noch final deklarieren, aber das ist ein anderes Thema).

Ob Du jetzt die Anforderungen erfüllt hast, kann man schwer beurteilen, da wir den Kontext nicht kennen. Kann sein, dass es reicht, kann sein, dass der Aufgabensteller sich eine Exception (statt dem return) wünscht, wie hier ja schon angesprochen wrude.

Jedenfalls stellt der Code sicher, dass nur ein Alter zwischen 0 und 29 (beide incl.) gesetzt werden kann.
 
Mal abgesehen davon, dass Deine Formatierung an Körperverletzung grenzt: wenn Du den Code im Konstruktor und der Methode setAlter anschaust, wirst Du feststellen: oh, der ist ja identisch.

Also kannst Du im Konstruktor einfach setAlter(alter) aufrufen (um Schweinereien zu verhindern, müsste man die Methode setAlter noch final deklarieren, aber das ist ein anderes Thema).

Ob Du jetzt die Anforderungen erfüllt hast, kann man schwer beurteilen, da wir den Kontext nicht kennen. Kann sein, dass es reicht, kann sein, dass der Aufgabensteller sich eine Exception (statt dem return) wünscht, wie hier ja schon angesprochen wrude.

Jedenfalls stellt der Code sicher, dass nur ein Alter zwischen 0 und 29 (beide incl.) gesetzt werden kann.
Die Formatierung wurde etwas verschoben weil ich das hier reinkopiert habe und es nicht angepasst habe, tut mir leid dafür.
Ja verstehe das tuhe ich ausbessern. Naja die Anforderung steht ja oben in meinem ersten Post, dass ist 1 zu 1 die Aufgabe.

"In einem Java-Programm fur eine Tierarztpraxis soll das Alter von Hunden erfasst werden. Dazu konnte man eine Klasse ’Hund’ mit einer Instanzvariablen ’Alter’ vom Typ ’int’ anlegen. Der Computer erkennt dann aber nicht, wenn im Java-Programm dieser Variablen irrtumlich ein unzulassiger Wert, wie z.B. ’45’ zugewiesen werden wurde. Wie kann man diese Schwachstelle vermeiden? Implementieren Sie Ihre Losung zu diesem Problem."

Wenn der Code aber das sicherstellt dann bin ich froh 🙂
 
Naja die Anforderung steht ja oben in meinem ersten Post, dass ist 1 zu 1 die Aufgabe.
Die habe ich natürlich gelesen, aber wenn jemand die Intention des Aufgabenstellers einschätzen kann, dann höchstens Du selbst. Es ist halt ein Unterschied, ob ich gerade die erste Schritte mache oder z. B. Exceptions schon behandelt wurden.
 

Zurück
Oben