Telefonbuch - Fehler beim Suchen

Anfänger86

Grünschnabel
Hallo, ich habe folgenden Code

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.Vector;

public class Telefonliste {

     // Deklaration BufferedReader zum Einlesen Eingabe von tastatur
     public BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
     public Vector<Telefonlisteneintrag> telefonliste; // Deklaration Vector telefonliste
     public Enumeration num;
      
        public Telefonliste() {
                // neuer Vector vom Typ telefonliste, in dem Einträge gespeichert werden
                telefonliste = new Vector();
                telefonliste.addElement( new Telefonlisteneintrag( "Tina Müller ", "0451/598547"));
                telefonliste.addElement( new Telefonlisteneintrag( "Klaus Fuchs ", "0587/45796"));
                telefonliste.addElement( new Telefonlisteneintrag( "Silke Rommel ", "0587/578512"));
                telefonliste.addElement( new Telefonlisteneintrag( "Franz Kluftlocher ", "0785/98745"));
        }

        public void menü(){

             boolean fertig = false; // boolean zum Schleifendurchlauf des Menüs

             while(!fertig) {
                // Menü der Telefonliste
                System.out.println("\nTelefonliste: ");
                System.out.println("[1] Alle Eintraege anzeigen");
                System.out.println("[2] Eintrag anlegen");
                System.out.println("[3] Eintrag löschen");
                System.out.println("[4] Eintrag bearbeiten");
                System.out.println("[5] Person suchen");
                System.out.println("[6] Nummer identifizieren");
                System.out.println("[0] Ende\n");

                try {
                String eingabe = stdin.readLine(); // Einlesen der Tastatureingabe
                if (eingabe.equals("0"))
                        System.exit(0); // wenn Eingabe 0, dann Programm beenden

                // wenn eingabe wie im Menü, dannw erden die jeweiligen Methoden aufgerufen
                if (eingabe.equals("1"))
                    alleAnzeigen();
                if (eingabe.equals("2"))
                    eintragAnlegen();
                if (eingabe.equals("3"))
                    eintragLöschen();
                if (eingabe.equals("4"))
                    eintragBearbeiten();
                if (eingabe.equals("5"))
                    personSuchen();
                if (eingabe.equals("6"))
                    nummerIdentifizieren();
                } // close try
                catch (IOException ex) {
                System.out.println("Fehler bei der Eingabe");
                } // close catch
             } fertig=false; // close while
          } // close menü()

        public void alleAnzeigen() {
                if (!telefonliste.isEmpty()) { // wenn Vector telefonliste nicht leer ist
                num = telefonliste.elements();
                while( num.hasMoreElements() ) // so lange Einträge im Vector sind
                        System.out.println(num.nextElement() ); // werden Einträge ausgegeben
                } // close if
                else
                        System.out.println("Kein Eintrag vorhanden"); // wenn kein Eintrag vorhanden
                        System.out.println("\nTaste drücken"); // Zurück zum Menü
                try {
                String name = stdin.readLine(); // Eingabe von Tastatur einlesen
                menü(); 
                } // close try
                catch(IOException ex) {
                System.out.println("Fehler"); // gibt Fehler aus wenn Eingabe falsch
                } // close catch
                // ruft Methode menü auf
        } // close alleAnzeigen()

          public void eintragAnlegen() {

                System.out.println("Zum Menü mit [0]"); // Hinweis zur Rückkehr zum Menü
                System.out.print("Namen eingeben: "); // Aufforderung zur Namenseingabe
                try {
                String name = stdin.readLine(); // Einlesen der Tastatureingabe
                    if (name.equals("0")) // wenn Eingabe 0 ist, dann zurück zum Menü
                            menü();
                            System.out.print("Nummer eingeben: "); // Aufforderung zur EIngabe der Nummer
                    String nummer = stdin.readLine(); // Einlesen der Tastatureingabe
                // neuen Telefonlisteneintrag erzeugen mit name und nummer
                     Telefonlisteneintrag eintrag = new Telefonlisteneintrag(name, nummer);
                     telefonliste.addElement(eintrag); // hinzufügen des Eintrags zum Vector
                     int indexW = telefonliste.indexOf(eintrag) ;
                     System.out.println ("\nBitte Taste drücken");
                     name = stdin.readLine(); // name einlesen
                     menü(); // zurück zum Menü
                } // close try
                catch(IOException ex) {
                System.out.println("Fehler"); // Ausgabe Fehlermeldung bei Falscheingabe
                } // close catch
        } // close eintragAnlegen()

          public void eintragLöschen() {

                System.out.println("Zum Menü mit [0]"); // Hinweis zur Rückkehr zum Menü
                System.out.print("Namen eingeben: "); // Aufforderung zur Namenseingabe
                try {
                String name = stdin.readLine(); // Eingabe von Tastatur einlesen
                  while(!name.equals("0")) {
                 if (name.equals("0")) // wenn eingabe gleich 0 ist, zurück zum Menü
                        menü(); // Aufruf der Methode menü()
                    Telefonlisteneintrag eintrag = null;
                for (Telefonlisteneintrag teleEintrag : telefonliste) {
                    if(teleEintrag.name.equals(name)){
                        eintrag = teleEintrag;
                    } // close if
                } // close for
                int indexW = telefonliste.indexOf(eintrag);
                    if (indexW>=0) // wenn indexW größer gleich 0
                        System.out.println( telefonliste.elementAt( indexW)); // dann Eintrag bei indexW hinzufügen
                        System.out.println("Löschen? ja/nein"); // Eingabeaufforderung zum Bestätigen des Löschvorgangs
                        name = stdin.readLine(); //
                    if (name.toLowerCase().equals("ja") || name.toLowerCase().equals("j"))
                        telefonliste.removeElementAt(indexW); // wenn eingabe "ja" oder "j" entspricht löschen
                   else
                        menü(); // Aufruf der Methode menü()
                  } // close while
                } // close if
                catch (IOException ex) {
                System.out.println("Fehler"); // Fehlermeldung bei Falscheingabe
                } // close catch
        } // close eintragLöschen()

          public void eintragBearbeiten() {

              System.out.println ("Zum Menü mit [0]"); // Hinweis zur Rückkerhr zum Menü
              System.out.println ("Namen eingeben: "); // Aufforderung zur Namenseingabe
              try {
                  String name=stdin.readLine(); // EIngabe von tastatur einlesen
                  if (name.equals("0")) // wenn Eingabe gleich 0, zurück zum Menü
                      menü(); // Aufruf der Methode menü()
                   Telefonlisteneintrag eintrag = null;
                for (Telefonlisteneintrag teleEintrag : telefonliste) {
                    if(teleEintrag.name.equals(name)){
                        eintrag = teleEintrag; // eintrag ist gleich teleEintrag
                    } // close if
                } // close for
                int indexW = telefonliste.indexOf(eintrag);
                  if (indexW>=0)
                      System.out.println (telefonliste.elementAt (indexW));
                  else
                      System.out.println (name+ "nicht vorhanden"); // wenn name nicht in Vector
                      System.out.println ("Neuer Name: "); // Aufforderung zur Eingabe neuer Name
                      name= stdin.readLine(); // Einlesen der Eingabe von der Tastatur
                      System.out.println ("Neue Nummer: "); // Aufforderung zur Eingabe der neuen Nummer
                      String nummer=stdin.readLine(); // Einlesen der Eingabe von der Tastatur
                      telefonliste.removeElementAt (indexW); //Eintrag bei indexW zurücksetzen
                      // Eintrag bei indexW neu erstellen
                      telefonliste.insertElementAt (new Telefonlisteneintrag (name, nummer), indexW);
                      System.out.println ("Neuer Eintrag: "); // Auswerfen des neuen Eintrags
                      System.out.println (telefonliste.elementAt(indexW)); //übersenden neuer Eintrag
                      System.out.println ("\nBitte Taste drücken"); // Aufforderung zum Drücken einer Taste
                      name=stdin.readLine(); // EInlesen der Eingabe von der Tastatur
                      menü();
              } // close try
              catch (IOException ex) {
                  System.out.println ("Fehler"); // Fehlermeldung bei Falscheingabe
              } // close catch
          } // close Methode eintragBearbeiten()

        public void personSuchen() {

                System.out.println("\nZum Menü mit [0]"); // Hinweis zur Rückkehr zum Menü
                System.out.print("Namen eingeben: "); // Aufforderung zur Eingabe eines Namens
                try {
                   String name = stdin.readLine(); // Eingabe von der Tastatur einlesen
                        while(!name.equals("0")) { // so lange Eingabe nicht 0 ist
                             Telefonlisteneintrag eintrag = null; // eintrag ist gleich null
                for (Telefonlisteneintrag teleEintrag : telefonliste) { // neuer Eintrag teleEintrag
                    if(teleEintrag.name.equals(name)){ // wenn die nummern gleich sind
                        eintrag = teleEintrag; // eintrag entspricht gleich teleEintrag
                    } // close if
                } // close for
                int indexW = telefonliste.indexOf(eintrag); // Position eintrag in Vector
                             if ( indexW >= 0 ) // wenn indexW größer gleich 0
                              // übertragen des Eintrags an Position indexW
                              System.out.println( telefonliste.elementAt( indexW));
                            else
                              System.out.println( name + " nicht vorhanden" ) ; // ansonsten nummer nicht vorhanden
                        personSuchen(); // Aufruf Methode personSuchen()
                        } // close while
                menü(); // Aufruf der Methode menü()
                } // close try
                catch (IOException ex) {
                System.out.println("Fehler"); // Fehlermeldung bei Falscheingabe
                } // close catch
        } // close Methode personenSuchen()

    
    public void nummerIdentifizieren() {

                System.out.println("\nZum Menü mit [0]"); // Hinweis zur Rückkehr zum Menü
                System.out.print("Nummer eingeben: "); // Aufforderung zur Eingabe eines Namens
                try {
                   String nummer = stdin.readLine(); // Einlesen der Eingabe von der Tastatur
                        while(!nummer.equals("0")) { // wenn eingabe nicht 0 ist
                              Telefonlisteneintrag eintrag = null; // eintrag ist gleich null
                for (Telefonlisteneintrag teleEintrag : telefonliste) { // neuer Eintrag teleEintrag
                    if(teleEintrag.nummer.equals(nummer)){ // wenn die nummern gleich sind
                        eintrag = teleEintrag; // eintrag entspricht gleich teleEintrag
                    } // close if
                } // close for
                int indexW = telefonliste.indexOf(eintrag); // Postiton eintrag in Vector
                             if ( indexW >= 0 ) // wenn indexW größer gleich 0
                              // übertragen des Eintrags an Position indexW
                              System.out.println( telefonliste.elementAt( indexW ));
                            else
                              System.out.println( nummer + " nicht vorhanden" ) ; // ansonsten nummer nicht vorhanden
                        nummerIdentifizieren(); // Aufruf Methode nummerIdentifizieren()
                        } // close while
                System.out.println();
                menü();
                } // close try
                catch (IOException ex) {
                System.out.println("Fehler");
                } // close catch
        } // close Methode nummerIdentifizieren


      public static void main ( String[] args) throws IOException {
  
        Telefonliste Telefonbuch = new Telefonliste(); // neues Objekt vom Typ Telefonliste

        Telefonbuch.menü(); // Aufruf der Merhode menü() über Objekt Telefonbuch
      } // close main-Methode
} // close class Telefonliste

eigentlich läuft das alles so wie es soll.
nur bei dem menüpunkt "eintrag löschen" habe ich ein problem.. ich kann ihn zwar die person die ich löschen will suchen lassen und sie wird auch gefudnen, aber wenn ich dann ja oder j eingebe zum bestätigen dann kriege ich eine fehlermeldung.
was habe ich falsch gemacht?
 
Moin,

beachte Bitte die Netiquette http://www.tutorials.de/index.php?pg=netiquette !!


nur bei dem menüpunkt "eintrag löschen" habe ich ein problem.. ich kann ihn zwar die person die ich löschen will suchen lassen und sie wird auch gefudnen, aber wenn ich dann ja oder j eingebe zum bestätigen dann kriege ich eine fehlermeldung.
was habe ich falsch gemacht?
Da Du nicht geschrieben hast, was genau Dein Problem ist resp. welchen Du Fehler Du bekommst!
Von daher kann ich jetzt nur spekulieren ....

Zuerst einmal würde ich dran gehen und die Funktion "eintragLöschen()" in "eintragLoeschen()" umbennen !!

Gruß
Klaus
 
oh, wieso hab ich was falsch gemacht?

also meine fehlermeldung ist diese hier:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: -1
at java.util.Vector.removeElementAt(Vector.java:515)
at Telefonliste.eintragLöschen(Telefonliste.java:136)
at Telefonliste.menü(Telefonliste.java:59)
at Telefonliste.eintragAnlegen(Telefonliste.java:108)
at Telefonliste.menü(Telefonliste.java:57)
at Telefonliste.main(Telefonliste.java:246)
Java Result: 1
 
Ohne mir das genauer anzuschauen, würde ich mal sagen, es trifft genau das zu was in der Exception steht: Du versuchst auf das Feld -1 eines Arrays zuzugreifen, was nicht geht, da die validen Felder eines Arrays 0 - (n - 1) sind.
 
und wie kann ich das dann ändern? ich hab das vor 7 wochen programmiert und heute da nochmal reingeguckt und nu geht es net mehr.. und ich könnte schwören damals ging das... merkartig...
 
Was daran liegt, dass du indexW unabhängig davon verwendest ob IndexOf einen korrekten Wert zurückgegeben hat:

/Edit: Das ist nicht die Lösung hier, sondern einfach bisschen formatiert was du geschrieben hast.
Java:
	int indexW = telefonliste.indexOf(eintrag);
	if (indexW>=0) // wenn indexW größer gleich 0
		System.out.println( telefonliste.elementAt( indexW)); // dann Eintrag bei indexW hinzufügen

	System.out.println("Löschen? ja/nein"); // Eingabeaufforderung zum Bestätigen des Löschvorgangs
	name = stdin.readLine(); //

	if (name.toLowerCase().equals("ja") || name.toLowerCase().equals("j"))
		telefonliste.removeElementAt(indexW); // wenn eingabe "ja" oder "j" entspricht löschen
	else
		menü(); // Aufruf der Methode menü()

} // close while

Bisschen übersichtlichere Programmieren würde ich dir auch anraten ;)
 
Zuletzt bearbeitet:
Nur weil ein Zustand funktioniert heißt das nicht, dass es ein anderer auch tut.
Setz nen Breakpoint in der Zeile wo du auf das Array zugreifst, schau im Debuger was die Variable die das Feld angibt enthält (weil ich nicht glaube das du meinen Post verstanden hast, sonst wärst du schon an der Fehlersuche/korrektur), und gehe zeilenweiße rückwärts, bis du raus hast wo die Variable falsch gesetzt wird.
 
Java:
//...
int indexW = telefonliste.indexOf(eintrag);
if (indexW>=0)
System.out.println (telefonliste.elementAt (indexW));
else
//...
telefonliste.removeElementAt (indexW); //Eintrag bei indexW zurücksetzen
// Eintrag bei indexW neu erstellen
telefonliste.insertElementAt (new Telefonlisteneintrag (name, nummer), indexW);
//...

Also gehen wir das mal durch....

Du suchst einen Eintrag... Wenn er ihn findet, gibt er ihn aus, weil indexW positiv (größer/gleich 0)... Wenn er ihn nicht findet (indexW ist -1), dann willst du ein Element bei -1 entfernen und ein Element bei -1 hinzufügen?!
 
öhm, da steht doch garnichts von insertElementAt....
wenn er den eintrag findet soll er fragen "soll das gelöscht werden? ja/nein"
und bei der eingabe ja/j soll er den eintrag löschen...
wenn ich nein eingebe geht er ins menü wie er es soll... bei ja hängt er sich dann auf..

und kai, nein ich habe deinen post nicht verstanden...
 
Zurück