Auf die harte Tour
Ich habe gerade einen üblen Bug in einem meiner Java-Projekte gefunden. Ich
benutzte einen StringTokenizer
, um einen String in eine Liste
einzulesen, der aus per Semikolon getrennten Teilstrings bestand:
StringTokenizer tokenizer = new StringTokenizer(tokenString, ";"); List tokens = new ArrayList(); for(int i = 0; i < tokenizer.countTokens(); i++) { tokens.add(tokenizer.nextToken().trim()); }
Wer findet den Fehler? Die Methode countTokens
gibt nicht etwa
die Gesamtanzahl an Tokens zurück. Sie berechnet, wie viele Tokens
noch übrig sind, d.h. wie oft man nextToken()
noch
aufrufen kann, ohne eine Exception zu bekommen! Natürlich war die Liste
dadurch nicht vollständig.
Nun bin ich ja ein guter Junge, also hatte ich natürlich einen JUnit-Test für die entsprechende Klasse geschrieben. Der Test prüft unter anderem, ob eine Liste, die ich aus einem wohldefinierten String erstellt habe, mit der Liste übereinstimmt, die von der zu testenden Klasse aus einem externen String erstellt wird. Und natürlich hatte ich eine ähnliche Schleife benutzt …
Und die Moral von der Geschicht': Schreibt Unit-Tests, aber vertraut ihnen nicht blind. Denn jemand muss auch die Kontrollinstanz kontrollieren.
Übrigens, die korrekte Schleife sieht so aus:
while(tokenizer.hasMoreTokens()) { tokens.add(tokenizer.nextToken().trim()); }
12:16, Permalink | Kommentieren | TrackBack-Info
Trackbacks are closed for this story.
Comments are closed for this story.