Hilfe bei Java Programm?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich hab mal meinen Senf in deinen Code geschrieben:

public class AdressenverwaltungFeld {
    
    /*
     * Für den Anfang kann man die innere Klasse so anlegen, aber ich würde dir empfehlen,
     * dir von Anfang an schon anzugewöhnen, dass die Felder in einer Klasse nie
     * direkt öffentlich zugänglich sind. Also entweder alles als final deklarieren und
     * nur im Konstruktor setzen, oder alles per Getter- und Setter-Methoden setzen.
     * 
     * Dadurch kannst du die Daten prüfen, bevor sie gespeichert werden. Z.B. dass eine PLZ
     * immer fünfstellig ist oder dass bei einer Hausnummer (die übrigens auch sowas, wie "7a" sein kann)
     * nicht allzuviele Buchstaben vorkommen, oder dass die Hausnummer nicht negativ ist.
     * 
     * Außerdem kannst du mit einem Konstruktor auch sichergehen, dass die Pflichtfelder
     * gefüllt sind.
     */
    //innere Klasse
    public static class Adresse {
        public String nachname;
        public String strasse;
        /*
         * Die Hausnummer würde ich auch als String implementieren, weil du damit
         * nicht rechnen musst und es auch Hausnummern, wie z.B. "7a" gibt
         */
        public int hausnummer;
        /*
         * Bei der PLZ würde ich auch String nehmen, weil es PLZs gibt, die mit 0
         * anfangen und du sonst damit Probleme kriegst. Außerdem willst du mit
         * der PLZ ja auch nicht rechnen und evtl. irgendwann mal ausländische PLZs
         * aufnehmen, wie z.B. "CH-1234"
         */
        public int plz;
        public String ort;
    }
    
    public static void main(String[] args){
        /*
         * Das hier könntest du mit einem Multi-Line-String abkürzen
         */
        //Hauptprogramm
        System.out.println("========================================");
        System.out.println("==Programm zur Verwaltung von Adressen==");
        System.out.println("========================================");
        
        /*
         * Hier entstehen ein paar Probleme
         */
        //Instanz der Klasse Adresse
        Adresse ad; // Kann auch weiter unten bei der Zuweisung gemacht werden
        ad = new Adresse(); // nicht nötig
        /*
         * Wenn du ein neues Array intanziierst, ist es erstmal leer. 
         * Also es wird einfach nur Platz reserviert, wo man drei Adressen-Objekte
         * einfügen könnte, aber es werden keine Adressen-Objekte erzeugt
         */
        Adresse[] adressen = new Adresse[3]; 
        ad = adressen[0]; // dadurch übergibst du hier einen Null-Pointer an ad
        for(int i = 0; i < adressen.length; i++){
            adressen[i] = new Adresse();
        }


        /*
         * Dadurch, dass du oben die Zuweisung an ad gemacht hast, bevor du das Array
         * mit Adressen-Objekten gefüllt hast, kriegst du hier natürlich eine
         * NullPointerException
         */
        //Einlesen der Adresse
        ad.nachname =  JOptionPane.showInputDialog("Geben Sie den Nachnamen ein:");
        ad.strasse = JOptionPane.showInputDialog("Geben Sie die Straße ein:");
        String eing = JOptionPane.showInputDialog("Geben Sie die Hausnummer ein:");
        ad.hausnummer = Integer.parseInt(eing);
        eing = JOptionPane.showInputDialog("Geben Sie die PLZ ein:");
        ad.plz = Integer.parseInt(eing);
        ad.ort = JOptionPane.showInputDialog("Geben sie den Ort ein:");
        //Ausgabe der Adresse
        System.out.println("Nachname: \t" + ad.nachname);
        System.out.println("Straße: \t" + ad.strasse + " " + ad.hausnummer);
        System.out.println("Ort: \t\t" + ad.plz + " " + ad.ort);
    }
}

daCypher  18.01.2023, 10:19

Ich hab deine Klasse mal ein bisschen aufgepimpt und die Fehler beseitigt:

import javax.swing.*;
import java.util.*;

public class AdressenverwaltungFeld {
    
    //innere Klasse
    public static class Adresse {
        public final String nachname;
        public final String strasse;
        public final String hausnummer;
        public final String plz;
        public final String ort;

        public Adresse(String nachname, String strasse, String hausnummer, String plz, String ort) {
            // Hier könnte man noch Prüfungen einbauen, um zu schauen, ob die Werte gültig sind,
            // aber für's erste reicht auch eine Zuweisung
            this.nachname = nachname;
            this.strasse = strasse;
            this.hausnummer = hausnummer;
            this.plz = plz;
            this.ort = ort;
        }

        // Mit toString kannst du einen Standard vorgeben, wie die
        // Adresse aussehen soll, wenn man sie anzeigen will
        @Override
        public String toString() {
            return String.format("""
                Familie %s
                %s %s
                %s %s""", 
                
                nachname, 
                strasse, hausnummer, 
                plz, ort
            );
        }
    }
    
    public static void main(String[] args){
        //Hauptprogramm
        System.out.println("""
            ========================================
            ==Programm zur Verwaltung von Adressen==
            ========================================""");
        
        // Damit dein Programm nicht auf drei Adressen begrenzt wird, nehmen wir
        // hier lieber eine List<Adresse>
        List<Adresse> adressen = new ArrayList<>();

        //Einlesen der Adresse
        // Wenn dein Programm eh in der Konsole läuft, könntest du die Eingaben auch über die Konsole
        // und nicht über ein JOptionPane machen
        boolean mehr = true;
        while (mehr) {
            String nachname =  JOptionPane.showInputDialog("Geben Sie den Nachnamen ein:");
            String strasse = JOptionPane.showInputDialog("Geben Sie die Straße ein:");
            String hausnummer = JOptionPane.showInputDialog("Geben Sie die Hausnummer ein:");
            String plz = JOptionPane.showInputDialog("Geben Sie die PLZ ein:");
            String ort = JOptionPane.showInputDialog("Geben sie den Ort ein:");
            adressen.add(new Adresse(nachname, strasse, hausnummer, plz, ort));
            
            mehr = JOptionPane.showConfirmDialog(null, "weitere Adresse eingeben?", "Adressenverwaltung", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
        }

        // Alternative über die Konsole
        /*
        Scanner input = new Scanner(System.in);
        boolean mehr = true;
        while (mehr) {
            System.out.println("Geben Sie den Nachnamen ein:");
            String nachname = input.nextLine();
            System.out.println("Geben Sie die Straße ein:");
            String strasse = input.nextLine();
            System.out.println("Geben Sie die Hausnummer ein:");
            String hausnummer = input.nextLine();
            System.out.println("Geben Sie die PLZ ein:");
            String plz = input.nextLine();
            System.out.println("Geben Sie den Ort ein:");
            String ort = input.nextLine();
            adressen.add(new Adresse(nachname, strasse, hausnummer, plz, ort));

            System.out.println("weitere Adresse eingeben? (J/N)");
            mehr = input.nextLine().equalsIgnoreCase("J");
        }
        input.close();
        */

        //Ausgabe der Adressen
        for (Adresse adresse: adressen) {
            System.out.println(adresse);
            System.out.println();
        }
    }
}
1
anonym20948 
Fragesteller
 19.01.2023, 13:13
@daCypher

Danke dir, bin noch nicht so tief in der Materie drin, aber deine Erklärung oben hat mir vieles erklärt. Echt top!

1

Teste mal diesen Code:

import javax.swing.*;
import java.io.*;


public class AdressenverwaltungFeld {
	
	//innere Klasse
	public static class Adresse {
		public String nachname;
		public String strasse;
		public int hausnummer;
		public int plz;
		public String ort;
	}
	
	public static void main(String[] args){
		//Hauptprogramm
		System.out.println("========================================");
		System.out.println("==Programm zur Verwaltung von Adressen==");
		System.out.println("========================================");
		
		//Instanz der Klasse Adresse
		Adresse[] adressen = new Adresse[3];
		for(int i = 0; i < adressen.length; i++){
			adressen[i] = new Adresse();
		}
		Adresse ad = adressen[0];
		
		//Einlesen der Adresse
		ad.nachname =  JOptionPane.showInputDialog("Geben Sie den Nachnamen ein:");
		ad.strasse = JOptionPane.showInputDialog("Geben Sie die Straße ein:");
		String eing = JOptionPane.showInputDialog("Geben Sie die Hausnummer ein:");
		ad.hausnummer = Integer.parseInt(eing);
		eing = JOptionPane.showInputDialog("Geben Sie die PLZ ein:");
		ad.plz = Integer.parseInt(eing);
		ad.ort = JOptionPane.showInputDialog("Geben sie den Ort ein:");
		
		//Ausgabe der Adresse
		System.out.println("Nachname: \t" + ad.nachname);
		System.out.println("Straße: \t" + ad.strasse + " " + ad.hausnummer);
		System.out.println("Ort: \t\t" + ad.plz + " " + ad.ort);
	}
}


du setzt ad = adressen[0] direkt nachdem du adressen[] erstellst, da ist aber noch nix drinn, deswegen NullPointerException weil eine Leere liste den Wert Null übergibbt wenn nix drinn ist

Edit:

wenn du ad in adressen[0] sepeichern willst mach nach deinem //Einlesen der Adressen Block, aber anders herum also so: "adressen[0] = ad;" so rum speichser du ad auf position 0 in dem adressen Array


anonym20948 
Fragesteller
 17.01.2023, 18:41

Ich komme nicht ganz dahinter. Was muss ich ändern bei ad = adressen[0]...

0
GreenAnswer  17.01.2023, 18:43
@anonym20948
import javax.swing.*;
import java.io.*;


public class AdressenverwaltungFeld {
	
	//innere Klasse
	public static class Adresse {
		public String nachname;
		public String strasse;
		public int hausnummer;
		public int plz;
		public String ort;
	}
	
	public static void main(String[] args){
		//Hauptprogramm
		System.out.println("========================================");
		System.out.println("==Programm zur Verwaltung von Adressen==");
		System.out.println("========================================");
		
		//Instanz der Klasse Adresse
		Adresse ad;
		ad = new Adresse();
		Adresse[] adressen = new Adresse[3];
  //		ad = adressen[0]; DEINE ZEILE MUSS RAUS
        // Der for loop ist auch quatsch weil du quasie das selbe machst wie bei der Deklaration nur in umständlich
		for(int i = 0; i < adressen.length; i++){
			adressen[i] = new Adresse();
		}
		//Einlesen der Adresse
		ad.nachname =  JOptionPane.showInputDialog("Geben Sie den Nachnamen ein:");
		ad.strasse = JOptionPane.showInputDialog("Geben Sie die Straße ein:");
		String eing = JOptionPane.showInputDialog("Geben Sie die Hausnummer ein:");
		ad.hausnummer = Integer.parseInt(eing);
		eing = JOptionPane.showInputDialog("Geben Sie die PLZ ein:");
		ad.plz = Integer.parseInt(eing);
		ad.ort = JOptionPane.showInputDialog("Geben sie den Ort ein:");

        adressen[0] = ad; // HIER MUSS ER SO HIN UM AD ZU SPEICHERN

		//Ausgabe der Adresse
		System.out.println("Nachname: \t" + ad.nachname);
		System.out.println("Straße: \t" + ad.strasse + " " + ad.hausnummer);
		System.out.println("Ort: \t\t" + ad.plz + " " + ad.ort);
	}
}

die Einrückung stimmt nicht ganz aber so speicherst du ad in deinem Array

0
anonym20948 
Fragesteller
 17.01.2023, 18:52
@GreenAnswer

Achso okay. Noch eine Frage: Wie bekomme ich es hin, dass ich mehrere Adressen eingeben kann?

0
GreenAnswer  17.01.2023, 18:59
@anonym20948
public class AdressenverwaltungFeld {
    
    //innere Klasse
    public static class Adresse {
        public String nachname;
        public String strasse;
        public int hausnummer;
        public int plz;
        public String ort;
    }
    
    public static void main(String[] args){
        //Hauptprogramm
        System.out.println("========================================");
        System.out.println("==Programm zur Verwaltung von Adressen==");
        System.out.println("========================================");
        
        //Instanz der Klasse Adresse
        Adresse ad;
        ad = new Adresse();
        Adresse[] adressen = new Adresse[3];
        //erstelle einen Counter um an die Positionen in dem Array zu kommen in deinem fall gibt es 3. 0,1 und 2
        int counter =0;
        //while um deine eingabe immer zu wieder holen für jede Position im Array
        while(counter<3){
        //Einlesen der Adresse
        ad.nachname =  JOptionPane.showInputDialog("Geben Sie den Nachnamen ein:");
        ad.strasse = JOptionPane.showInputDialog("Geben Sie die Straße ein:");
        String eing = JOptionPane.showInputDialog("Geben Sie die Hausnummer ein:");
        ad.hausnummer = Integer.parseInt(eing);
        eing = JOptionPane.showInputDialog("Geben Sie die PLZ ein:");
        ad.plz = Integer.parseInt(eing);
        ad.ort = JOptionPane.showInputDialog("Geben sie den Ort ein:");


        adressen[counter] = ad; // HIER MUSS ER SO HIN UM AD ZU SPEICHERN: Note, 0 durch counter ersetzen


        //Ausgabe der Aktuellen Adresse
        System.out.println("Nachname: \t" + ad.nachname);
        System.out.println("Straße: \t" + ad.strasse + " " + ad.hausnummer);
        System.out.println("Ort: \t\t" + ad.plz + " " + ad.ort);


        //zähl den Counter hoch
        counter=counter+1;


        }
        // zum schluss werden einmal alle Adressen ausgegeben
        // ausgabe ist gleich nur dass counter jetzt i heißt
        for (int i = 0; i<3 ; i++){
            System.out.println("Adresse \t" + i+1);
            System.out.println("Nachname: \t" + adressen[i].nachname);
            System.out.println("Straße: \t" + adressen[i].strasse + " " + adressen[i].hausnummer);
            System.out.println("Ort: \t\t" + adressen[i].plz + " " + adressen[i].ort);
        }

    }

}

0