# getter/setter aufrufen



## SiN (7. Jan 2013)

hi leute,

ich bin neu hier und habe grade mit java angefangen.
macht mir echt spaß und bin hoch motiviert! 

allerdings habe ich ein arges problem mein programm fertig zu stellen.
nach 3 tagen youtube, video2brain und edlichen surfen im internet habe ich immernoch keine antwort gefunden und hoffe das ich hier hilfe bekommen kann.

wie immer handelt es sich um eine aufgabenstellung,
die wie folgt lautet:

programmiert ein programm zur ein und ausgabe einer postialischen adresse.
die adresseteile sollen in "private" Strings gespeichert werden und durch get und set methoden verwaltet werden. also es darf keine ein und ausgabe in diesen methoden statt finden
(außer fehlermeldungen).

soweit so gut.
ich habe nun mein konsolenmenu, meine vorgespeicherte "max mustermann"-adresse und probiert das ganze in die verlangten methoden zu stecken.
allerdings kann ich diese nicht aufrufen, da diese nicht statisch sind (im gegensatz zur main methode)
gut, also weiß ich was zu tun ist.. ich muss die irgendwie auf einen nenner bekommen.
ich vermute ich sollte hier irgendwie neue objekte basteln, die dann ebenfalls static sind?
jedenfalls komme ich zur zeit nicht weiter und das sieht man dem code auch an 

z.b. sieht man glaube ich, das ich nicht wirklich den bezug der variabeln raffe..
      was sich jetzt auf was beziehen soll...


```
//Name ändern
	    public void setName(String neuName){
	    	this.name = neuName;
	    }
```

ich wäre echt dankbar für eine erläuterung des bezuges.

und ja, hier mal das ganze prog..
wenn mir da mal jemand mitteilen kann, wie ich es hinbekomme das static/non static -problem in 
den griff zu kriegen, wäre das echt klasse!

mfg


```
import java.io.*;


	public class Adressbuch{
		
	    //Speicherbelegungen
	    private String name = "Max Mustermann";
	    private String strhaus = "Musterstrasse 1";
	    private String geb = "01.01.2013";
	    private String plz = "12345";
	    private String ort = "Muster";
	    
	    
	    //Methoden zur Addressausgabe und Bearbeitung
	    //Ausgabe
	    public String getAdresse(){
	    	return (name + "/n" + strhaus + "/n" + "Geboren: " + geb + "/n" + plz + "/n" + ort);
	    }
	    
	    //Name ändern
	    public void setName(String neuName){  //baustelle
	    	this.name = neuName;
	    }
	    
	    //Straße und Hausnummer ändern
	    public void setStrhaus(String neuStrhaus){ //baustelle
	    	this.strhaus = neuStrhaus;
	    }
	    
	    //Geburtsdatum ändern
	    public void setGeb(String neuGeb){ //baustelle
	    	this.geb = neuGeb;
	    }
	    
	    //PLZ ändern
	    public void setPlz(String neuPlz){  //baustelle
	    	this.plz = neuPlz;
	    }
	    
	    //Ort ändern
	    public void setOrt(String neuOrt){  //baustelle
	    	this.ort = neuOrt;
	    }
	    
	  public static void main(String args[ ]) throws IOException {
		  
	    //Benutzerbegruessung
	    System.out.println("##############################");
	    System.out.println("####______Adressbuch______####");
	    System.out.println("####_________1.0__________####");
	    System.out.println("####____by___S__i__N______####");
	    System.out.println("##############################");

	      //Auswahlmenue
	      System.out.print("\n---------Auswahlmenue---------\n");
	      System.out.print("Bitte treffen Sie ihre Auswahl\n\n");
	      System.out.println("[1]...Adresse ausgeben");
	      System.out.println("[2]...Namen editieren");
	      System.out.println("[3]...Strasse/Hausnummer editieren");
	      System.out.println("[4]...Geburstsdatum editieren");
	      System.out.println("[5]...PLZ editieren");
	      System.out.println("[6]...Ort editieren");
	      System.out.print("[0]...Programm Beenden\n\n");


	    //Reader
	    InputStreamReader isr = new InputStreamReader(System.in);
	    BufferedReader bReader = new BufferedReader(isr);


	    //Schleife wird gestartet
	    boolean bQuit = false;
	    for (int i = 0; !bQuit; i++) {

	    //Benutzereingabe
	    System.out.print("Auswahl: ");
	    String menueEingabe = bReader.readLine();
	    

	    //Auswertung der Eingabe
	    if (menueEingabe.equals("1")) {
	    System.out.println(getAdresse());  //baustelle
		}

	    else if (menueEingabe.equals("2")) {
			System.out.print("Bitte geben Sie den Namen ein: ");
			name.setName(bReader.readLine());  //baustelle
	    }

	    else if (menueEingabe.equals("3")) {
			System.out.print("Bitte geben Sie die Strasse und die Hausnummer ein: ");
			strhaus = bReader.readLine(); //baustelle
	    }

	    else if (menueEingabe.equals("4")) {
			System.out.print("Bitte geben Sie die Postleitzahl und den Ort ein: ");
			plzort = bReader.readLine();  //baustelle
	    }

	    else if (menueEingabe.equals("0")) {
			System.out.println("Auf Wiedersehen");
			bQuit = true;
	    }

	    else {
	    System.out.println("Falsche Eingabe!");
	    System.out.println("Bitte versuchen Sie es erneut.");
	    }

	    }//Ende der Schleife

	  }//Ende Main

	}//Ende Adressbuch
```


----------



## Gast2 (7. Jan 2013)

Dir fehlen Grundlagen zu Objekten, eigenen Klassen, static, etc.
Daher hier erstmal was zu lesen: Galileo Computing :: Java ist auch eine Insel - 5 Eigene Klassen schreiben

Zu deinem Code:
Der Name Adressbuch ist fragwürdig. Dein Adressbuch kann aktuell eine Adresse speichern, daher wäre der Name Adresse wohl passender.

Um dann damit arbeiten zu können brauchst du eine Instanz der Klasse: 
	
	
	
	





```
Adresse adresse = new Adresse ();
```
Auf dieser Instanz kannst du dann die getter/setter aufrufen.


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Adresse {

	private String name;
	private String strhaus;
	private String geb;
	private String plz;
	private String ort;

	// Methoden zur Addressausgabe und Bearbeitung
	// Ausgabe
	public String getAdresse() {
		return (name + "/n" + strhaus + "/n" + "Geboren: " + geb + "/n" + plz + "/n" + ort);
	}

	// Name ändern
	public void setName(String neuName) { // baustelle
		this.name = neuName;
	}

	// Straße und Hausnummer ändern
	public void setStrhaus(String neuStrhaus) { // baustelle
		this.strhaus = neuStrhaus;
	}

	// Geburtsdatum ändern
	public void setGeb(String neuGeb) { // baustelle
		this.geb = neuGeb;
	}

	// PLZ ändern
	public void setPlz(String neuPlz) { // baustelle
		this.plz = neuPlz;
	}

	// Ort ändern
	public void setOrt(String neuOrt) { // baustelle
		this.ort = neuOrt;
	}

	public static void main(String args[]) throws IOException {

		// Benutzerbegruessung
		System.out.println("##############################");
		System.out.println("####______Adressbuch______####");
		System.out.println("####_________1.0__________####");
		System.out.println("####____by___S__i__N______####");
		System.out.println("##############################");

		// Auswahlmenue
		System.out.print("\n---------Auswahlmenue---------\n");
		System.out.print("Bitte treffen Sie ihre Auswahl\n\n");
		System.out.println("[1]...Adresse ausgeben");
		System.out.println("[2]...Namen editieren");
		System.out.println("[3]...Strasse/Hausnummer editieren");
		System.out.println("[4]...Geburstsdatum editieren");
		System.out.println("[5]...PLZ editieren");
		System.out.println("[6]...Ort editieren");
		System.out.print("[0]...Programm Beenden\n\n");

		// Reader
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader bReader = new BufferedReader(isr);

		// Adress Instanz erzeugen, mit der wird gearbeitet
		Adresse adresse = new Adresse();

		// Schleife wird gestartet
		boolean bQuit = false;
		while (!bQuit) {

			// Benutzereingabe
			System.out.print("Auswahl: ");
			String menueEingabe = bReader.readLine();

			// Auswertung der Eingabe
			if (menueEingabe.equals("1")) {
				System.out.println(adresse.getAdresse());
			} else if (menueEingabe.equals("2")) {
				System.out.print("Bitte geben Sie den Namen ein: ");
				adresse.setName(bReader.readLine()); // baustelle
			} else if (menueEingabe.equals("3")) {
				System.out.print("Bitte geben Sie die Strasse und die Hausnummer ein: ");
				adresse.setStrhaus(bReader.readLine()); // baustelle
			} else if (menueEingabe.equals("4")) {
				System.out.print("Bitte geben Sie die Postleitzahl und den Ort ein: ");
				adresse.setPlz(bReader.readLine()); // baustelle
				adresse.setOrt(bReader.readLine()); // baustelle
			} else if (menueEingabe.equals("0")) {
				System.out.println("Auf Wiedersehen");
				bQuit = true;
			} else {
				System.out.println("Falsche Eingabe!");
				System.out.println("Bitte versuchen Sie es erneut.");
			}
		}
	}
}
```


----------



## Final_Striker (7. Jan 2013)

SiN hat gesagt.:


> allerdings kann ich diese nicht aufrufen, da diese nicht statisch sind (im gegensatz zur main methode)
> gut, also weiß ich was zu tun ist.. ich muss die irgendwie auf einen nenner bekommen.
> ich vermute ich sollte hier irgendwie neue objekte basteln, die dann ebenfalls static sind?
> jedenfalls komme ich zur zeit nicht weiter und das sieht man dem code auch an



Du musst ein Objekt (Instanz) von deiner Klasse Adressbuch anlegen. Dann kannst du die get-Methoden dieses Objektes verwenden.

Vielleicht noch mal nachlesen: Galileo Computing :: Java ist auch eine Insel - 5 Eigene Klassen schreiben


Als Anfänger braucht man in der Regel kein 
	
	
	
	





```
static
```
, natürlich abgesehen von der main-Methode.


----------



## hüteüberhüte (7. Jan 2013)

Klingt doch leicht:


```
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.GregorianCalendar;
import java.util.List;

/**
 * @author hütte
 */
public class Adresse {

    private static final SimpleDateFormat sdf = (SimpleDateFormat) SimpleDateFormat.getDateInstance();
    private String nam;
    private String str;
    private String plz;
    private String ort;
    private long geb;

    public Adresse(String nam, String str, String plz, String ort, long geb) {
        this.nam = nam;
        this.str = str;
        this.plz = plz;
        this.ort = ort;
        this.geb = geb;
    }

    public long getGeb() {
        return geb;
    }

    public void setGeb(long geb) {
        this.geb = geb;
    }

    public String getNam() {
        return nam;
    }

    public void setNam(String nam) {
        this.nam = nam;
    }

    public String getOrt() {
        return ort;
    }

    public void setOrt(String ort) {
        this.ort = ort;
    }

    public String getPlz() {
        return plz;
    }

    public void setPlz(String plz) {
        this.plz = plz;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "Adresse{" + "nam=" + nam + ", str=" + str + ", plz=" + plz + ", ort=" + ort + ", geb=" + sdf.format(geb) + '}';
    }

    public static void main(String[] args) {
        // Menü basteln, evtl. neue Klasse für Liste
        List<Adresse> adressen = Arrays.asList(
                new Adresse("Max Muster", "MStraße 99", "12345", "MStadt", new GregorianCalendar(1970, 0, 1).getTimeInMillis()),
                new Adresse("Max Muster 2", "MStraße 99", "12345", "MStadt", new GregorianCalendar(1970, 0, 1).getTimeInMillis()));
        for (Adresse adresse : adressen) {
            System.out.println("adresse = " + adresse);
        }
    }
}
```

Get- und set-Methoden, sind eigentlich dafür da, die Eingabe zu prüfen, ggf. Attribute zu setzen und um darauf wieder zuzugreifen.

Nicht-statische Variablen (Attribute/Instanzvariablen) gibt es für jede neue Instanz, statische Variablen (Klassenvariablen) gibt es für eine Klasse immer nur einmal.


----------



## hüteüberhüte (7. Jan 2013)

Wie ich auf die toString-Methode usw. komme: Ich hab das einfach in Netbeans gekloppt, erstellt dann prompt die übrigen Methoden.

Für die Eingabe ist BufferedReader geeignet. Wenn mehrere Adressen eingegeben werden sollen können, kannst du die Eingabe innerhalb einer Schleife schreiben. n8.


----------



## SiN (7. Jan 2013)

ertmal danke an alle für die schnelle hilfe!
das hat echt geholfen... habe jetzt meine wissenslücken gefüllt und raff das mit den objekten(instanzen) jetzt.
somit habe ich auch mein problem im griff.

wie schon gesagt sind getter und setter unter andern dafür da um eingaben zu prüfen.
das ganze habe ich jetzt auch vor mit einer if-abfrage.
nur reicht mein wissen da jetzt nicht so ganz aus... ich kenne die operatoren,
aber das reicht in diesem fall nicht. (if bla > 0 dann..)

ich soll nun prüfen ob:
- die PLZ eingabe aus genau 5 ziffern besteht
- name und ort auch nur aus buchstaben, leerzeichen und bindestrichen besteht
- das geburtsdatum aus 2 zahlen, dann einen punkt und so weiter besetht (tt.mm.jjjj)

ich habe nun probiert:


```
public void setName(String neuName) { 
    	if (Character.isAlphabetic(String neuName)){
        this.name = neuName;
    	}
```

allerdings ohne erfolg. ich weiß leider auch nicht genau was eclipse von mir will!
nach Character.xxxxxxx wird ja eine variable verlangt... den zusammenhang verstehe ich nicht
und für die exceptions finde ich auch nichts passendes.. character. könnte ja was sein für den namen..

schonmal ganz lieben dank an alle!

hier noch einmal der code soweit:


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Adresse {
 
    private String name = "Max Mustermann";
    private String strhaus = "Musterstrasse 1";
    private String geb = "01.01.2013";
    private String plz = "12345";
    private String ort = "Muster";
 
    // Getter zur Ausgabe
    public String getName() {
        return (name);
    }
 
    public String getStrhaus() {
        return (strhaus);
    }
    
    public String getGeb() {
        return (geb);
    }
    
    public String getPlz() {
        return (plz + " ");
    }
    
    public String getOrt() {
        return (ort);
    }   
    
    // Setter für Eingaben
    public void setName(String neuName) { 
    	if (Character.isAlphabetic(String neuName)){
        this.name = neuName;
    	}
    	else{
    		System.out.println("Ungültige Eingabe! Bitte geben Sie den Vornamen und dann den Nachnamen ein.");
    		System.out.println("Nur Buchstaben, Leerzeichen und Bindestriche sind gültig.");
    	}
    }
 
    public void setStrhaus(String neuStrhaus) {
        this.strhaus = neuStrhaus;
    }
 
    public void setGeb(String neuGeb) {
        this.geb = neuGeb;
    }
 
    public void setPlz(String neuPlz) {
        this.plz = neuPlz;
    }

    public void setOrt(String neuOrt) {
        this.ort = neuOrt;
    }
 
    public static void main(String args[]) throws IOException {
 
        // Benutzerbegruessung
        System.out.println("##############################");
        System.out.println("####______Adressbuch______####");
        System.out.println("####_________1.0__________####");
        System.out.println("####____by___S__i__N______####");
        System.out.println("##############################");
 
        // Auswahlmenue
        System.out.print("\n---------Auswahlmenue---------\n");
        System.out.print("Bitte treffen Sie ihre Auswahl\n\n");
        System.out.println("[1]...Adresse ausgeben");
        System.out.println("[2]...Namen editieren");
        System.out.println("[3]...Strasse/Hausnummer editieren");
        System.out.println("[4]...Geburstsdatum editieren");
        System.out.println("[5]...PLZ editieren");
        System.out.println("[6]...Ort editieren");
        System.out.print("[0]...Programm Beenden\n\n");
 
        // Reader
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader bReader = new BufferedReader(isr);
 
        // Adress Instanz wird erzeugt für die Bearbeitung
        Adresse adresse1 = new Adresse();
 
        // Schleife wird gestartet
        boolean bQuit = false;
        while (!bQuit) {
 
            // Benutzereingabe
            System.out.print("Auswahl: ");
            String menueEingabe = bReader.readLine();
 
            // Auswertung der Eingabe
            if (menueEingabe.equals("1")) {
                System.out.println(adresse1.getName());
                System.out.println(adresse1.getStrhaus());
                System.out.println(adresse1.getGeb());
                System.out.print(adresse1.getPlz());
                System.out.println(adresse1.getOrt());
            }
              
              else if (menueEingabe.equals("2")) {
                System.out.print("Bitte geben Sie den vollen Namen ein: ");
                adresse1.setName(bReader.readLine());
              }   
             
              else if (menueEingabe.equals("3")) {
                  System.out.print("Bitte geben Sie das Gebursdatum ein: ");
                  adresse1.setGeb(bReader.readLine()); 
              }  
              
              else if (menueEingabe.equals("4")) {
                  System.out.print("Bitte geben Sie die Strasse und die Hausnummer ein: ");
                  adresse1.setStrhaus(bReader.readLine()); 
              }  
            
              else if (menueEingabe.equals("5")) {
                  System.out.print("Bitte geben Sie die Postleitzahl ein: ");
                  adresse1.setPlz(bReader.readLine()); 
              }
              
              else if (menueEingabe.equals("6")) {
                  System.out.print("Bitte geben Sie den Ort ein: ");
                  adresse1.setOrt(bReader.readLine()); 
              }
            
              else if (menueEingabe.equals("0")) {
                System.out.println("Auf Wiedersehen");
                bQuit = true;
              }  
             
              else {
                System.out.println("Falsche Eingabe!");
                System.out.println("Bitte versuchen Sie es erneut.");
              }
            
        }//Ende Schleife
        
    }//EndeMain
    
}//Ende Adresse
```


----------



## Phash (7. Jan 2013)

Character.isAlphabetic erwartet einen int Wert
du gibst ihm einen String.

du muesstest ueber alle Buchstaben des Strings iterieren und diese Buchstaben als chars auswerten.
Das ginge mit

```
for (int x = 0; x < neuerName.length; x++){
      Character.isAlphabetic (neuerName.charAt(x))}
```


die if-Abfragen auf Zahlen solltest du besser in ein switch-case packen, ist uebersichtlicher
und Code hat in der Main Klasse eigentlich nicht viel zu suchen.

pack das in eigene Methoden in deiner Klasse, nicht in die MainMethode


----------



## SiN (7. Jan 2013)

danke für den ansatz!
nur reicht es ja nicht nur auf chars zu prüfen.
schließlich ist ein leerzeichen und bindestrich auch okay.

das geburtsdatum in einem switch case zu verarbeiten ist sicher die besste lösung.
nur wie?

den ganzen kram mache ich ja auch nicht in der main, sondern in den set-methoden!
aber ich habs bis jetzt noch nicht hinbekommen... ich will einfach nur in meine 
set-methoden, die if-abfragen und den switch/case block richtig formulieren, das die gewünschten exceptions stattfinden.


----------



## hüteüberhüte (7. Jan 2013)

SiN hat gesagt.:


> wie schon gesagt sind getter und setter unter andern dafür da um eingaben zu prüfen.
> das ganze habe ich jetzt auch vor mit einer if-abfrage.
> nur reicht mein wissen da jetzt nicht so ganz aus... ich kenne die operatoren,
> aber das reicht in diesem fall nicht. (if bla > 0 dann..)
> ...



Das geht am leichtesten mit Regex, also regulären Ausdrücken... habe einfach mal angepasst:


```
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

/**
 * @author hütte
 */
public class Adresse {

    private String nam;
    private String str;
    private String plz;
    private String ort;
    private String geb;
    private static final Pattern nam_ort_pat = Pattern.compile("^[a-zA-Z \\-]+$");
    private static final Pattern str_pat     = Pattern.compile("^[a-zA-Z]+ \\d+$");
    private static final Pattern plz_pat     = Pattern.compile("^\\d{5}$");
    private static final Pattern geb_pat     = Pattern.compile("^\\d{2}\\.\\d{2}\\.\\d{4}$");

    public Adresse(String nam, String str, String plz, String ort, String geb) {
        setNam(nam);
        setStr(str);
        setPlz(plz);
        setOrt(ort);
        setGeb(geb);
    }

    public String getNam() {
        return nam;
    }

    public final void setNam(String nam) {
        if (!nam_ort_pat.matcher(nam).find()) {
            throw new IllegalArgumentException(nam);
        }
        this.nam = nam;
    }

    public String getStr() {
        return str;
    }

    public final void setStr(String str) {
        if (!str_pat.matcher(str).find()) {
            throw new IllegalArgumentException(str);
        }
        this.str = str;
    }

    public String getPlz() {
        return plz;
    }

    public final void setPlz(String plz) {
        if (!plz_pat.matcher(plz).find()) {
            throw new IllegalArgumentException(plz);
        }
        this.plz = plz;
    }

    public String getOrt() {
        return ort;
    }

    public final void setOrt(String ort) {
        if (!nam_ort_pat.matcher(ort).find()) {
            throw new IllegalArgumentException(ort);
        }
        this.ort = ort;
    }

    public String getGeb() {
        return geb;
    }

    public final void setGeb(String geb) {
        if (!geb_pat.matcher(geb).find()) {
            throw new IllegalArgumentException(geb);
        }
        this.geb = geb;
    }

    @Override
    public String toString() {
        return "Adresse{" + "nam=" + nam + ", str=" + str + ", plz=" + plz + ", ort=" + ort + ", geb=" + geb + '}';
    }

    public static void main(String[] args) {
        // Menü basteln, evtl. neue Klasse für Liste
        List<Adresse> adressen = Arrays.asList(
                new Adresse("Max Muster", "MStrasse 99", "12345", "MStadt", "01.01.1970"),
                new Adresse("Max MuStEr", "MStrasse 66", "67890", "MStAdT", "02.01.1970"));
        for (Adresse adresse : adressen) {
            System.out.println("adresse = " + adresse);
        }
    }
}
```

Es gibt auch die matches()-Methode, aber ich glaube, nicht so schnell bei mehreren Aufrufen.

Tutorial: Lesson: Regular Expressions (The Java™ Tutorials > Essential Classes)


----------



## hüteüberhüte (7. Jan 2013)

SiN hat gesagt.:


> das geburtsdatum in einem switch case zu verarbeiten ist sicher die besste lösung.
> nur wie?



Für Datumsangaben würde ich immer ein neues Calendar -Objekt erstellen, das wird sonst schnell sehr komplex!


----------

