Hilfe bei Java Programm?
Hi.
Ich habe wollte eine Übung in Java programmieren, jedoch schmeißt er mir einen NullPointerException-Fehler aus. Es geht um ein Programm zur Adressenverwaltung, wo mehr als eine Adresse abgespeichert werden kann. Könnt ihr mir dabei helfen?
Hier mein 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 ad;
ad = new Adresse();
Adresse[] adressen = new Adresse[3];
ad = adressen[0];
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:");
//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);
}
}
Vielen Dank schonmal.
3 Antworten
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);
}
}
Danke dir, bin noch nicht so tief in der Materie drin, aber deine Erklärung oben hat mir vieles erklärt. Echt top!
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
Ich komme nicht ganz dahinter. Was muss ich ändern bei ad = adressen[0]...
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
Achso okay. Noch eine Frage: Wie bekomme ich es hin, dass ich mehrere Adressen eingeben kann?
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);
}
}
}
Vielen Dank, hast mir echt weitergeholfen!
Ich hab deine Klasse mal ein bisschen aufgepimpt und die Fehler beseitigt: