# "doppelte" if-Anweisung



## Susi (15. Jun 2006)

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



```
/**
* 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


----------



## André Uhres (15. Jun 2006)

Warum machst du nicht zwei Methoden:
gibLoginName
gibLoginMatrikelnummer


----------



## dieta (15. Jun 2006)

Wenn ich das richtig verstehe, müsste das klappen:


```
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;
}
```


----------



## Murray (15. Jun 2006)

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.):

```
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:


```
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:

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


----------



## jagdfalke (15. Jun 2006)

ACHTUNG: DOPPELTER THREAD:
http://forum.javacore.de/viewtopic.php?t=3517

Sowas wird nicht gerne gesehen Susi.

mfg
jagdfalke


----------



## André Uhres (15. Jun 2006)

Ich stimme jagdfalke zu.
Warum sollte gibLogin*Name* nicht auch genau das zurückgeben?
Nämliche *name*! Und sonst nix.


----------



## Murray (15. Jun 2006)

André Uhres hat gesagt.:
			
		

> Warum sollte gibLogin*Name* 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.:
			
		

> ```
> /**
> * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
> * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
> ...


Offenbar ist also eine Methode *gibLoginName* gefragt, die aus den Membern *name* und *matrikelnummer* einen neuen String erzeugt.


----------



## André Uhres (15. Jun 2006)

Murray hat gesagt.:
			
		

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


OK, hab's gechecked. Warum soll man's eigentlich einfach machen wenn's auch kompliziert geht


----------



## bygones (15. Jun 2006)

Murray hat gesagt.:
			
		

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


Benamung... Schelm der sich da verliest....


----------



## L-ectron-X (15. Jun 2006)

Welcome back!  
Du bringst die Leute nur auf dumme Gedanken... :wink:


----------



## Murray (15. Jun 2006)

deathbyaclown hat gesagt.:
			
		

> Murray hat gesagt.:
> 
> 
> 
> ...


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)


----------

