matches() IllegalStateException

Peter027

Mitglied
Guten Tag,

ich möchte mit einem Programm einen Ausschnitt einer Logfile auslesen. Die text Datei enthält dabei nur die zeile (183.121.143.32 - - [18/Mar/2003:08:05:03 +0200] "GET /images/bild.png HTTP/1.1" 200 805 "http://www.google.org/")
Wenn ich die zeile in einem Interface einbaue und nicht aus einer text datei lesen lasse funktioniert das auch. Allerdings kriege ich jetzt immer den Fehler IllegalStateException.
Habe schon verschiedene arten des einlesen ausprobiert aber nichts hat zum erfolg geführt.
Ich hoffe sehr das ihr mir helfen könnt. :)

Java:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class logfileRead {

	public static void main(String[] argv) throws IOException {
		int NUM_FIELDS = 9;
		Pattern pattern = Pattern
				.compile("^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"([^\"]+)\"");

		String test = new String("183.121.143.32");

		try {
			BufferedReader br = new BufferedReader(new FileReader("test.txt"));

			while ((test = br.readLine()) != null) {
				System.out.println(test);
				Matcher matcher = pattern.matcher(test);

				if (!matcher.matches() || NUM_FIELDS != matcher.groupCount()) {
					System.err
							.println("Ungueltiger Log eintrag oder falscher Patter?:");
					System.err.println(test);
					return;
				}

				System.out.println("IP Address: " + matcher.group(1));
				System.out.println("Date&Time: " + matcher.group(4));
				System.out.println("Request: " + matcher.group(5));
				System.out.println("Response: " + matcher.group(6));
				System.out.println("Bytes Sent: " + matcher.group(7));
				if (!matcher.group(8).equals("-"))
					System.out.println("Referer: " + matcher.group(8));
				System.out.println("Browser: " + matcher.group(9));

			}
		} catch (IOException e) {
			e.printStackTrace();
		}
     }
}
 
Zuletzt bearbeitet:

FetterOtter

Bekanntes Mitglied
Hi Peter,

also ich kann dein KSKB insofern problemlos laufen lassen, dass ich "nur" die kontrollierte Fehlermeldung "Ungueltiger Log eintrag oder falscher Patter?:" bekomme. Keine "IllegalStateException" weit und breit...
 

Peter027

Mitglied
Sobald man das return wegnimmt kommt der Fehler und auch mit return sollte er ja eigentlich etwas finden da das ganze funktioniert wenn ich ihm das ganze als Interface gebe und nicht als Text datei
 

eRaaaa

Top Contributor
Also ich verstehe deine 9. Gruppe nicht im Bezug auf deinem Beispiel, dort gibt es keinen Browser, das letzte ist der Referer, dementsprechend sollte
Java:
Pattern
                .compile("^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\"");
funktionieren, dann aber eben Zeile 42 auskommentieren und NUM_FIELDS = 8
Java:
// System.out.println("Browser: " + matcher.group(9));
oder aber eben dein Logeintrag bzw Textdatei überprüfen....

IllegalStateException kann ich hier allerdings auch nicht erkennen, wie lautet denn der gesamte Stacktrace? In welcher Zeile soll der auftauchen?
 

Peter027

Mitglied
Die Zeile die eingelesen wird ist halt nur ein beispiel. Es sollen auch welche gehen die den browser enthalten.
Ich glaube ich habe mich falsch ausgedrückt. Das Problem ist halt das er kein Ergebnis findet obwohl er eigentlich alles finden sollte.
Wenn ich halt "return" aus zeile 32 weg nehme und so mit das programm nicht abbreche kriege ich folgende fehlermeldung: Exception in thread "main" java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Unknown Source)
at logfileRead.main(logfileRead.java:35)


Aber wie gesagt sollte er ja eigentlich alle Informationen finden da es auch so funktioniert wenn ich den String mit hilfe eines Interfaces benutze.
Selbst mein lehrer konnte nach 2 Stunden keine lösung finden bzw mir erklären wieso das programm nichts findet.
 

eRaaaa

Top Contributor
Das Problem ist halt das er kein Ergebnis findet obwohl er eigentlich alles finden sollte.
Wie ich oben schon geschrieben habe, er findet eben NICHTS weil das Pattern nicht passt wenn es KEINEN Browser gibt. Das Pattern funktioniert nur wenn er alle 9 Gruppen findet, wenn der Browser im Log fehlt sind es eben nur 8....
Wenn ich halt "return" aus zeile 32 weg nehme und so mit das programm nicht abbreche kriege ich folgende fehlermeldung: Exception in thread "main" java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Unknown Source)
at logfileRead.main(logfileRead.java:35)
Eben, siehe oben
Aber wie gesagt sollte er ja eigentlich alle Informationen finden da es auch so funktioniert wenn ich den String mit hilfe eines Interfaces benutze.
Selbst mein lehrer konnte nach 2 Stunden keine lösung finden bzw mir erklären wieso das programm nichts findet.
Wie gesagt, das Pattern ist falsch, wenn der Browser optional ist könntest folgendes versuchen:
Java:
Pattern pattern = Pattern.compile("([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\"(?: \"([^\"]+)\")?");
bzw.
Java:
Pattern pattern = Pattern.compile("([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" (?:\"([^\"]+)\")?");
je nachdem ob nun das Leerzeichen trotzdem im Logfile vorhanden ist wenn es keinen Browser gibt oder nicht....Browser wird dann
Code:
null
sein
 

Ähnliche Java Themen

Neue Themen


Oben