# If-Anweisung in Konstruktor



## district (26. Jul 2008)

Hallo zusammen 

Bin gerade mit BlueJ am Java lernen...

Da wir verlang in einen Konstruktor mittel if-Methode (ohne else) eine String Länge zu kontrollieren (Martikelnummer benötigt mind. vier Zahlen).

Geht das überhaupt, erhalte nämlich immer eine Fehlermeldung. 

Auf google find ich nichts gescheites.

Soweit bin ich gekommen:

```
/**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     */
    public Student(String vollerName, String matrNr)
    {
        name = vollerName;
        matrikelnummer = matrNr;
        {if (matrikelnummer < 1000){
            System.out.println("Ihr Name muss mehr als vier Zeichen besitzen!");
        } 
    }
        scheine = 0; 
    }
```


----------



## maki (26. Jul 2008)

Setze deine geschweiften Klammern richtig, dann hole dir eine richtige IDE.


----------



## district (26. Jul 2008)

maki hat gesagt.:
			
		

> Setze deine geschweiften Klammern richtig, dann hole dir eine richtige IDE.




Was meinst du mit IDE? Klammer hab ich nun geändert..


```
/**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     */
    public Student(String vollerName, String matrNr)
    {
        scheine = 0;  
        name = vollerName;
        matrikelnummer = matrNr;{
            if (matrikelnummer < 1000){
            System.out.println("Ihr Name muss mehr als vier Zeichen besitzen!");
        }
    }
}
```


Mir wird folgendes falsch markiert:
if (matrikelnummer < 1000){[/code][/quote]


----------



## SchonWiederFred (26. Jul 2008)

Welchen Typ hat matrikelnummer?


----------



## district (26. Jul 2008)

Typ ist String. 

Hab versucht 1000 in "" zu setzen, Fehlermeldung besteht noch.


----------



## SchonWiederFred (26. Jul 2008)

Du kannst einen String und einen int nicht mit < vergleichen, das ergibt keinen Sinn.

Warum ist matrikelnummer überhaupt ein String? Warum nicht int?

Und warum taucht in der Fehlermeldung der "Name" auf, obwohl es doch die Matrikelnummer ist, die Probleme bereitet???


----------



## maki (26. Jul 2008)

> Was meinst du mit IDE?


IDE= Integrated Development Environment, zB. Eclipse, NetBeans, etc. pp.
BlueJ ist schlecht, sehr schlecht sogar.



> Klammer hab ich nun geändert..


Nein hast du nicht, du hast sie nur verschben, sie ist immer noch falsch weil überflüssig.


----------



## district (26. Jul 2008)

```
/**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     */
    public Student(String vollerName, String matrNr)
    {
        scheine = 0;  
        name = vollerName;
        matrikelnummer = matrNr;
            if (matrikelnummer < "1000"){
            System.out.println("Ihre Nummer muss mehr als vier Zeichen besitzen!");
        }
    }
```

Das mit Name war ein Tipp-Fehler.

Komme da auf keinen grünen Zweig... hab jetzt alles auf int gewechselt Fehlermeldung BlueJ:
operator < can not be applied to int

Wechsle ich alles auf String kommt die Meldung genau gleich einfach mit String.


----------



## district (26. Jul 2008)

Muss leider mit BlueJ noch dieses Semester lernen... Studiumvorlagen


----------



## SchonWiederFred (26. Jul 2008)

Hm? Also bei den formalen Parametern steht doch immer noch zweimal String. Poste mal den neuen Code.

Die Fehlermeldung ist immer noch irreführend. Wenn Du Zahlen ab 1000 erlaubst, dann muss man NICHT "mehr als vier Zeichen" sondern "mindestens vier Zeichen" zur Verfügung stellen.


----------



## district (26. Jul 2008)

Habs jetzt geändert inkl. Datenfelder


```
public class Student
{
    // der volle Name des Studierenden
    private String name;
    // seine Matrikelnummer
    private int matrikelnummer;
    // die Anzahl der bereits erworbenen Scheine
    private int scheine;

    /**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     */
    public Student(String vollerName, int matrNr)
    {
        scheine = 0;  
        name = vollerName;
        matrikelnummer = matrNr;
            if (matrikelnummer < 1000){
            System.out.println("Ihre Nummer muss mehr als vier Zeichen besitzen!");
        }
    }
```


----------



## SchonWiederFred (26. Jul 2008)

Der Code gibt bei mir keine Fehlermeldungen. Gibt es von Deiner Seite noch Fragen?


----------



## district (26. Jul 2008)

danke für eure Hilfe.

Bei mir funktionierts auch... ausser das der folgende Code nun nicht mehr geht.

Aber werd ich wohl irgendwie raustüfteln.


```
/**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     */
    public String gibLoginName()
    {
        return name.substring(0,4) + matrikelnummer.substring(0,3);
    }
```


----------



## SchonWiederFred (26. Jul 2008)

Wenn Du in dem obigen Codefragment matrikelnummer durch String.valueOf(matrikelnummer) ersetzt, sollte es funktionieren. Alternativ kannst Du auch Integer.toString(matrikelnummer) verwenden.


----------



## district (26. Jul 2008)

```
/**
     * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
     */
    public Student(String vollerName, int matrNr)
    {
        scheine = 0; 
        name = vollerName;
        matrikelnummer = matrNr;
            if (String.valueOf(matrikelnummer) < 1000){
            System.out.println("Ihre Nummer muss mehr als vier Zeichen besitzen!");
        }
    }
```

Fehlermeldung... 

Oder müsste ich trotzdem irgendwie mit String arbeiten? Da ich den Name danach zusätzlich auch noch auf mind. 3 Zeichen kontrollieren muss.[/code]


----------



## district (26. Jul 2008)

Kann das Problem nicht mit length gelöst werden?


```
if (matrikelnummer.length() < 1000){
```


----------



## SchonWiederFred (26. Jul 2008)

???

"Wenn Du *in dem obigen Codefragment* [...]", damit meine ich die Methode gibLoginName. Da wo der Fehler auftrat.



			
				district hat gesagt.:
			
		

> Kann das Problem nicht mit length gelöst werden?


Wenn matrikelnummer ein String ist, dann ja. Aber die Länge 1000 ist wohl ein bischen zu viel des guten...


----------



## district (26. Jul 2008)

jeeetz hab ichs glaub kapiert  


```
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.
     */
    public Student(String vollerName, String matrNr)
    {
        scheine = 0; 
        name = vollerName;
        if (name.length() < 3){
            System.out.println("Ihr Name muss mehr als drei Zeichen besitzen!");
        }
        matrikelnummer = matrNr;
            if (matrikelnummer.length() < 4){
            System.out.println("Ihre Nummer muss mehr als vier Zeichen besitzen!");
        }
    }
```

Danke für eure/deine Hilfe :toll: [/code]


----------



## district (26. Jul 2008)

Ich komme nochmals mit nem Problem...


```
/**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     */
    public String gibLoginName()
    {
        if (name.length() >= 3)
        {
            if (matrikelnummer.length() >= 4);
            {
                return (name.substring(0,4) + matrikelnummer.substring(0,3));
            }
        }
        else{
            if (name.length() < 3){
                if (matrikelnummer.length() < 4);
                {
                    return name + matrikelnummer;
                }
            }
        }
    }
```
Erhalte immer ein missing return statement... Kann das darin liegen das ich zwei returns in die Methode gepackt habe?


----------



## tfa (26. Jul 2008)

Nein. Du hast nicht alle möglichen Fälle berücksichtigt.
Wenn z.B. name.length() >= 3 und matrikelnummer.length() < 4 wird kein return ausgeführt.


----------



## district (26. Jul 2008)

Das wären ja alle Möglichkeiten und trotzdem erhalte ich nen Fehler... kann ich das Ganze nicht irgendwie kürzer fassen?




```
/**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     */
    public String gibLoginName()
    {
        if (name.length() >= 3)
        {
            if (matrikelnummer.length() >= 4);
            {
                return (name.substring(0,4) + matrikelnummer.substring(0,3));
            }
        }
        else{
            if (name.length() < 3){
                if (matrikelnummer.length() < 4);
                {
                    return name + matrikelnummer;
                }
            }
             if (name.length() < 3){
                if (matrikelnummer.length() >= 4);
                {
                    return name + matrikelnummer;
                }
            }
            if (name.length() >= 3){
                if (matrikelnummer.length() < 4);
                {
                    return name + matrikelnummer;
                }
            } 
        }
    }
```


----------



## Der Müde Joe (26. Jul 2008)

meinst du so?


```
public class Student {
	// der volle Name des Studierenden
	private String name;
	// seine Matrikelnummer
	private int matrikelnummer;
	// die Anzahl der bereits erworbenen Scheine
	private int scheine;

	/**
	 * Erzeuge einen neuen Studenten mit Name und Matrikelnummer.
	 */
	public Student(String name, int matrikelnummer) {
		if (matrikelnummer < 1000) {
			throw new IllegalArgumentException("Matrikelnummer zu klein: " + matrikelnummer);
		}
		this.name = name;
		this.matrikelnummer = matrikelnummer;
		this.scheine = 0;
	}

	public String getLogin() {
		String mat = "" + matrikelnummer;
		if (name.length() > 4) {
			return name.substring(0, 4) + mat.substring(0, 3);
		} else {
			return this.name + mat;
		}
	}
}
```


----------



## district (26. Jul 2008)

ahm..Danke    muss das aber etw. zerlegen.. so weit bin ich noch nicht ganz.


----------



## district (26. Jul 2008)

hab gehofft dies Funktion geht.. aber leider auch nicht !?


```
/**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     */
    public String gibLoginName()
    {
        if (name.length() >= 3)
        {
            if (matrikelnummer.length() >= 4);
            {
                return (name.substring(0,4) + matrikelnummer.substring(0,3));
            }
        }
        else {
            if ((name.length() < 3) && (matrikelnummer.length() < 4)) || ((name.length() < 3) && (matrikelnummer.length() >= 4)) || ((name.length() >= 3) && (matrikelnummer.length() < 4)))
            {
                return name + matrikelnummer;
            }
        }
    }
```


----------



## 0x7F800000 (26. Jul 2008)

jede denkbare zweig muss einfach nur mit "return" enden das ist alles


```
if(...){
  if(...){
    return x;
  }else if(...){
    return y;
  }else{               //  <------------ in jedem zweig muss es am ende else geben, in dem etwas zurueckgegeben wird!!!
    return z;
  }
}else{
   if(...){
      return u;
   }else if(){
      return v;
   }else{ //  <---------------- hier auch
      if(){
           return v2;
      }else{
           if(){
                return v31;
           }else{
                if(){
                     return v311;
                }else if(){
                     return v312;
                }else{  // <------------------------------------- immer ein else, egal wie tief verzweigt!
                     return v313;
                }
           }
       }
   }
}
```

sorg einfach dafuer, dass in jedem fall etwas zurueckgegeben wird, dann kompilliert es fehlerfrei. Wenn du keine Lust darauf hast, bau ganz am ende in allerletzten zeile deiner Funktion folgendes ein:


```
return "FEHLER! Sie haben einen viel zu verkrüppelten Namen, und können sich deshalb nicht einloggen. Pech gehabt!";
```

Dann kompiliert es sicherlich^^


----------



## Gast (27. Jul 2008)

Kurz ausgedrückt, was passiert, wenn beide deine if-Anweisungen nicht erfüllt sind?! Nichts und deshalb der Fehler entweder du machst zu jedem if ein else mit return oder du definierst ein lokales Objekt vom Typ String am Anfang der Methode mit und setzt den Wert innerhalb der if-Anweisungen oder gibst eben am ende einen leeren String zurück


----------



## district (27. Jul 2008)

Vielen Dank für eure Hilfe...

manchmal muss man nur eine Nach darüber schlafen :-D


```
/**
     * Liefere den Login-Namen. Der Login-Name ist eine Kombination der
     * ersten vier Buchstaben des Namens mit den ersten drei Ziffern der
     * Matrikelnummer.
     */
    public String gibLoginName()
    {
        if (((name.length() < 3) && (matrikelnummer.length() < 4)) || ((name.length() < 3) && (matrikelnummer.length() >= 4)) || ((name.length() >= 3) && (matrikelnummer.length() < 4)))
        {
            return name + matrikelnummer;
        } 
        else
        {
            return name.substring(0,4) + matrikelnummer.substring(0,3);
        }
    }
```


----------



## Der Müde Joe (27. Jul 2008)

>((name.length() < 3) && (matrikelnummer.length() < 4))

dieser Fall existiert nicht, da die Matrikelnummer immer  >1000 ist, also lenth 4+

>((name.length() < 3) && (matrikelnummer.length() >= 4))

 dies ist immer so, wenn name.length() < 3, da ja die Nummer >1000
also ist das && überflüssig

>((name.length() >= 3) && (matrikelnummer.length() < 4))

(matrikelnummer.length() < 4) sollte es nicht geben, da >1000

um dies zu garantieren, muss eben die IllegalArgumentException in den Konstruktor


----------

