Typeahead-Tool stürzt ab

Hallo zusammen!
Ich habe eine Art Typeahead-Funktion in einer kleinen JAVA-Anwendung implementiert. Es werden Elemente vom Typ Begriff in eine jList geladen und diese wird dann durchsucht. Eigentlich läuft das ganze auch zufriedenstellend und performant. Immerhin landen in der Liste ca. 40000 Einträge. Leider bleibt das Programm nach dauerhafter Benutzung dann irgendwann stehen. Ich habe schon zur Optimierung eine Alternative implementiert, die für den Fall, dass die vorherige Eingabe ein Substring der neuen Eingabe ist (deswegen gibt es zwei Suchparameter: den aktuellen Suchstring und den letzten). Allerdings passiert der Absturz auch immer bei der zweiten Version (im else-Teil). Ich hoffe, der Quellcode ist ausreichend, um das Problem zu verstehen.
Woran kann der Absturz liegen? Ich habe schon an einige Dinge gedacht:
  • garbage Collection? Aber es werden ja keine Objekte neu erzeugt, die entsorgt werden müssten, sondern nur existierende durchsucht
  • führt irgendeine Suche dazu, dass eine Endlosschleife läuft? Aber die gleiche Eingabe funktioniert manchmal und manchmal nicht
Es ist mit Sicherheit kein optimaler Code, sollte nur ein kleines, auf die schnelle geschriebenes Hilfstool sein.
Exceptions entstehen nicht, Laufzeitfehler gibt es auch nicht.
Vielen Dank für alle Hilfe!

Java:
  public void suchen1(String s, String old){
    jList1.clearSelection();
    BegriffListModel aktuellModel;
    if (s.equals("")){
      aktuellModel=jList1Model;
    }else if(old!=null && !old.equals("") && s.contains(old)){
      System.out.println("new s=" +s+" old="+old);
      aktuellModel=(BegriffListModel)jList1.getModel();   
      for (int i=0;i<aktuellModel.size();) {
        Begriff b=(Begriff)aktuellModel.elementAt(i);
        String t=b.getWort();
        if (!(t.length()>=s.length() && t.toLowerCase().contains(s.toLowerCase()))) {
          tempModel.remove(i);
        }else{i++;} // end of if
       
      }
    }else{
      System.out.println("old s=" +s+" old="+old);
      tempModel.clear();
      aktuellModel=tempModel;
      for (int i=0;i<jList1Model.size()-1;i++) {
        Begriff b=(Begriff)jList1Model.elementAt(i);
        String t=b.getWort();
        if (t.length()>=s.length() && t.toLowerCase().contains(s.toLowerCase())) {
          tempModel.addElement(b);
        } // end of if
       
      } // end of for
     
    }
    jList1.setModel(aktuellModel);
  }
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
for(int i=0;i<aktuellModel.size();){
    Begriff b=(Begriff)aktuellModel.elementAt(i);
    String t=b.getWort();
    if (!(t.length() >= s.length()&& t.toLowerCase().contains(s.toLowerCase()))){
          tempModel.remove(i);
    } else {
          i++;
    }// end of if   
}

Das kann zu einer Endlosschleife werden.
Angenommen !(t.length() >= s.length()&& t.toLowerCase().contains(s.toLowerCase())) ist wahr, wird i niemals erhöht, sondern unendlich dieser Fall wieder ausgeführt.
(Die Längenprüfung kann man auch weglassen, die sollte im contains sowieso gemacht werden ;))

Außerdem dürfte das weiter Bugs verursachen, die Indizes sind spätestens mit dem ersten Löschen nicht mehr gleich, du löscht also vermutlcih nicht das gewünschte Objekt.
Besser dürfte da sein, mit foreach (entweder als Schleife oder #forEach) und #remove(Object) zu arbeiten (oder wenn möglich #removeIf())
 

Meniskusschaden

Top Contributor
Ehrlich gesagt ist mir das zu unübersichtlich, um es gründlich zu lesen. An deiner Stelle würde ich es etwas lesbarer gestalten. Dann ist vielleicht auch die Fehlersuche einfacher.

Trotzdem ist auffällig, dass du die Laufvariable der ersten for-Schleife nicht im Kopf inkrementierst, sondern nur im else-Zweig der if-Bedingung. Bist du sicher, dass der wirklich hinreichend oft erreicht wird?
 
@mrBrown
Hm. Ich denke nicht, dass das das Problem ist, denn wenn die Bedingung erfüllt ist, wird das Element aus der Liste entfernt. Damit ist das aktuelle Element ein anderes und auch die Länge der Liste hat sich geändert.
Außerdem dürfte das weiter Bugs verursachen, die Indizes sind spätestens mit dem ersten Löschen nicht mehr gleich, du löscht also vermutlcih nicht das gewünschte Objekt.
Deswegen wir i ja beim Löschen nicht verändert.
Wie gesagt: bei gleichen Eingaben läuft es manchmal und manchmal nicht.

@Meniskusschaden
Ich hatte die alte Version (else-Zweig) kopiert und angepasst, daher die fehlende Inkrementierung.

Insgesamt funktioniert das Programm wie gesagt schon ziemlich gut, nach einiger Zeit allerdings nicht mehr.
 

mrBrown

Super-Moderator
Mitarbeiter
Du iterierst über und holst Elemente aus aktuellModel, löscht aber aus tempModel!
Sollten das die selbst Listen sein, solltest du den Code dringest überarbeiten.
Wenn nein, ist dein Begriff b immer der selbe, wenn die Bedingung einmal zutrifft, weil du eben aus der Liste nichts löscht, aber i auch nicht erhöhst.
 
Hm. Die Listen sind tatsächlich die selben. Hatte die temporäre Liste nur eingefügt, weil ich bei leerer Eingabe ja wieder die Ursprüngliche herstellen wollte. Da braucht ja nichts durchsucht werden. Ich habe schon eine Weile daran rumoptimiert. Vielleicht hätte ich besser den ursprünglichen Code direkt hier gepostet...
Hier wird einem ja super geholfen. Ich schau mir das nochmal an und melde mich wieder. :)
 
Also. Ich glaube, ich habe jetzt wieder die ursprüngliche Version.
Jetzt muss ich erstmal sehen, ob das Problem in der Praxis wieder auftritt.

Java:
public void suchen1(String s, String old){
    jList1.clearSelection();
 
    if (s.equals("")){
      jList1.setModel(jList1Model);
    }else{
      tempModel.clear();
   
      for (int i=0;i<jList1Model.size();i++) {
        Begriff b=(Begriff)jList1Model.elementAt(i);
        String t=b.getWort();
        if (t.toLowerCase().contains(s.toLowerCase())) {
          tempModel.addElement(b);
        } // end of if
     
      } // end of for
      jList1.setModel(tempModel);
    }
 
  }

Danke für die Hilfe bisher!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JEP 343: Packaging Tool (Incubator) Java Basics - Anfänger-Themen 1
D Java-API mit Command Line Tool für Rasenroboter umsetzen Java Basics - Anfänger-Themen 10
L Jar aus Jar Starten lassen (Update Tool) Java Basics - Anfänger-Themen 6
N Tool Tipp für Radio Button Java Basics - Anfänger-Themen 3
J Java Installing Tool Java Basics - Anfänger-Themen 3
B Erste Schritte Javadoc Tool Java Basics - Anfänger-Themen 7
V Tool zum Umrechnen Dezimal in Hex Java Basics - Anfänger-Themen 7
J Java Tool unter Windows ausführen Java Basics - Anfänger-Themen 8
R Welches Tool soll ich benutzen? Java Basics - Anfänger-Themen 19
G gutes Reporting Tool welches mit Java zusammenarbeitet Java Basics - Anfänger-Themen 8
G GUI Tool Java Basics - Anfänger-Themen 2
A Annotation Processing Tool - Source Code Generierung Java Basics - Anfänger-Themen 1
L welches tool NetBeans 6.0.1 oder Eclipse ? Java Basics - Anfänger-Themen 11
G Forum überwachungs tool Java Basics - Anfänger-Themen 5
1 Ansatz/Hilfe für ein Tool gesucht Java Basics - Anfänger-Themen 4
P Setup-Tool Java Basics - Anfänger-Themen 2
D Suche immernoch ein tool. Java Basics - Anfänger-Themen 16
P Flashähnliches Tool für Java, gibt es so was? Java Basics - Anfänger-Themen 12
J Tool Tip Im TExtfeld von JTable Java Basics - Anfänger-Themen 5
F kostenloses, gutes UML Tool zum rumprobieren Java Basics - Anfänger-Themen 7
T Programm stürzt ab Java Basics - Anfänger-Themen 40
C Erste Schritte WindowBuilder 1.9.1 stürzt ab Java Basics - Anfänger-Themen 5
E SocketServer/Client stürzt ab. Address already in use. Java Basics - Anfänger-Themen 2
T Input/Output Programm terminiert nicht -> stürzt ab, wo Fehler? Java Basics - Anfänger-Themen 3
das_leon Erste Schritte Programm stürzt ab Java Basics - Anfänger-Themen 3
J Eingabeaufforderung stürzt ab (beim Ausführen einer Java-Datei) Java Basics - Anfänger-Themen 3
W Eclipse auf Linux langsam und stürzt teilweise ab Java Basics - Anfänger-Themen 2
P Exportierte jar Datei stürzt ab Java Basics - Anfänger-Themen 2
C Programm stürzt bei größeren Listen ab Java Basics - Anfänger-Themen 13
H programm stürzt ab Java Basics - Anfänger-Themen 6
C Applet stürzt ab Java Basics - Anfänger-Themen 15
S Programm stürzt immer ab Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben