"doppelte" if-Anweisung

  • Themenstarter Themenstarter Susi
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

Susi

Gast
Hallo ... warum funktioniert dieser Code nicht? Kann mir jemand helfen?


Code:
/**
* Diese Klasse definiert Studenten in einem Uni-Verwaltungssystem.
* Sie beschreibt die Details von Studenten, die für unseren Kontext
* relevant sind.
*
* @author  Michael Kölling und David J. Barnes
* @version 1.0  (3. Januar 2003)
*/
public class Student
{
    // der volle Name des Studierenden
    private String name;
    // seine Matrikelnummer
    private String matrikelnummer;
    // die Anzahl der bereits erworbenen Scheine
    private int scheine;

    /**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     * Wenn weniger als 4 Buchstaben und weniger als 3 Ziffern eingegeben werden
     * gib eine Warnung aus, führe die Eingabe aber trotzdem durch.
     */
     public Student(String vollerName, String matrNr)
    {
        if (vollerName.length()<4)
        {
        System.out.println("Bitte geben Sie mindestens einen vier-stelligen Namen ein!");
        }
        if  (matrNr.length()<3)
        {
        System.out.println("Bitte geben Sie mindestens eine drei-stellige Matrikelnummer ein!");
        }
       
        name = vollerName;
        matrikelnummer = matrNr;
        scheine = 0;
   
    }


    /**
     * Liefere den vollen Namen dieses Studenten.
     */
    public String gibName()
    {
        return name;
    }

    /**
     * Trage einen neuen Namen ein.
     */
    public void nameAendern(String neuerName)
    {
        name = neuerName;
    }

    /**
     * Liefere die Matrikelnummer dieses Studenten.
     */
    public String gibMatrikelnummer()
    {
        return matrikelnummer;
    }

    /**
     * Erhöhe die Anzahl der erworbenen Scheine.
     */
    public void erhoeheScheinanzahl(int weitereScheine)
    {
        scheine += weitereScheine;
    }

    /**
     * Liefere die Anzahl der bereits erworbenen Scheine.
     */
    public int gibScheinanzahl()
    {
        return scheine;
    }

   /**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     * Wenn keine vier Buchstaben eingegeben wurden liefere
     * einfach die eingegeben Buchstaben ab, wenn mehr als 4 Buchstaben eingegeben
     * wurden dann berschränke den Buchstaben-Teil im Login-Namen auf die ersten 4 Ziffern.
     * Wenn keine drei Ziffern eingegeben wurden liefere
     * einfach die eingegeben Ziffern ab, wenn mehr als 3 Ziffern eingegeben
     * wurden dann berschränke den Ziffern-Teil im Login-Namen auf die ersten 3 Ziffern.
     */
    public String gibLoginName()
   
    {
    if (name.length()<4){
        return name;
        }
    else{
    return name.substring(0,4);
    }
   
    {
    if (matrikelnummer.length()<3){
        return matrikelnummer;
    }
    else{
        return matrikelnummer.substring(0,3);
    }
    }
   
    /**
     * Gib Name und Matrikelnummer auf der Konsole aus.
     */
    public void ausgeben()
    {
        System.out.println(name + " (" + matrikelnummer + ")");
    }
}

liegt das Problem an der doppelten if-Anweisung bei "gib LoginName"? Ist sie falsch geschrieben? Müsste ja praktisch name+matrikelnummer gleichzeitung auf ihre
substrings untersuchen?
Wenn mir jemand helfen kann bitte auf niedrigstem Niveau Very Happy ...haben JAVA-Programmierung erst seit ein paar Wochen und ich kann keine Befehle verwenden die wir noch gar nicht gelernt haben bzw. nie lernen werden..

Vielen herzlichen Dank schon mal im voraus.
LG Susi
 
Wenn ich das richtig verstehe, müsste das klappen:

Code:
public String gibLoginName()
{
    String out = "";
    
    if (name.length()<4)
    {
        out = out + name;
    }
    else
    {
        out = out + name.substring(0,4);
    }
   
    //{ <-- ist die Klammer da erwünscht?
    if (matrikelnummer.length()<3)
    {
        out = out + matrikelnummer;
    }
    else
    {
       out = out + matrikelnummer.substring(0,3);
    }
    
    return out;
}
 
Die return-Anweisung sorgt ja dafür, dass die Methode verlassen wird. der Code danach kann nicht mehr ausgeführt werden. In Deinem Beispiel sollte der Compiler das eigentlich bemerken und "unreachable code" anmeckern.

Abhilfe (z.B.):
Code:
public String gibLoginName() {

    String nn = null;
    if (name.length()<4){
        nn= name;
    } else{
      nn = name.substring(0,4);
    }
   
    String mn = null;
    if (matrikelnummer.length()<3){
        mn = matrikelnummer;
    } else{
        mn = matrikelnummer.substring(0,3);
    }
    return nn+mn;
 }

Dabei hat man unschönerweise zweimal ziemlich ähnlichen Code; den kann man besser in eine eigene Methode auslagern:

Code:
private String stripStr( String str, in len) {
   if ( str.length() <= len) {
      return str;
   } else {
      return str.substring( 0 , len);
   }
}

public String gibLoginName() {

    return stripStr( name, 4) +  stripStr( matrikelnummer, 3);
 }

Die Methode stripStr kann man auch noch kürzer schreiben:
Code:
private String stripStr( String str, in len) {
   return  ( str.length() <= len) ? str : str.substring( 0 , len);
}
 
Ich stimme jagdfalke zu.
Warum sollte gibLoginName nicht auch genau das zurückgeben?
Nämliche name! Und sonst nix.
 
André Uhres hat gesagt.:
Warum sollte gibLoginName nicht auch genau das zurückgeben?
Nämliche name! Und sonst nix.

Die Benamung ist vielleicht etwas unglücklich, die Sematik ist aber doch offenbar so vorgegeben:

Susi hat gesagt.:
Code:
   /**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     * Wenn keine vier Buchstaben eingegeben wurden liefere
     * einfach die eingegeben Buchstaben ab, wenn mehr als 4 Buchstaben eingegeben
     * wurden dann berschränke den Buchstaben-Teil im Login-Namen auf die ersten 4 Ziffern.
     * Wenn keine drei Ziffern eingegeben wurden liefere
     * einfach die eingegeben Ziffern ab, wenn mehr als 3 Ziffern eingegeben
     * wurden dann berschränke den Ziffern-Teil im Login-Namen auf die ersten 3 Ziffern.
     */
    public String gibLoginName()
Offenbar ist also eine Methode gibLoginName gefragt, die aus den Membern name und matrikelnummer einen neuen String erzeugt.
 
deathbyaclown hat gesagt.:
Murray hat gesagt.:
Die Benamung ist vielleicht etwas unglücklich, die Sematik ist aber doch offenbar so vorgegeben:
Benamung... Schelm der sich da verliest....
Wahrscheinlich handelt es sich um künstliche Benamung, oder es ist ein Namenstrang verknotet. Vielleicht sind auch Namenzellen fehlgebildet (soll ja zu harten Fahradsätteln liegen können)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben