# Fehler in Suns FilteredRowSet Implementierung?



## FenchelT (12. Sep 2007)

Hallo,

habe mal eine Frage zur folgenden Fehlermeldung:

Exception in thread "main" java.lang.NullPointerException
	at test.FilteredRowSet.MyFilter.evaluate(MyFilter.java:64)
	at com.sun.rowset.FilteredRowSetImpl.internalNext(Unknown Source)
	at com.sun.rowset.CachedRowSetImpl.next(Unknown Source)
	at test.FilteredRowSet.MainCtrl.init(MainCtrl.java:43)
	at test.FilteredRowSet.MainCtrl.<init>(MainCtrl.java:19)
	at test.FilteredRowSet.Start.main(Start.java:30)


Es wird mir das gesamte FilteredRowSet ausgegeben. Mitten drin tacuht diese Fehlermedlung auf, allerdings werden trotzdem alle Datensaetze angezeigt.

Kann mir evtl jemand sagen, was hiermit gemeint ist?
at com.sun.rowset.FilteredRowSetImpl.internalNext(Unknown Source)

Handelt es sich hierbei um einen Java Fehler?

Ich koennte so langsam echt kot...  Es bringt mich noch lansam zur Verzweiflung dieses FilteredRowSet.
Wenn das nicht bald laeuft, schreibe ich mein eigenes  :? 


Danke schonmal fuer eure Unterstuetzung


----------



## Wildcard (12. Sep 2007)

Der Fehler liegt wohl in MyFilter in Zeile 64:
test.FilteredRowSet.MyFilter.evaluate(MyFilter.java:64)


----------



## FenchelT (13. Sep 2007)

Moin wildcard,

hmm, es passiert nicht wirklich viel "kompliziertes" in Zeile 64 

Zeile 63:
String columnValue = frs.getString(this.columnName)

Zeile 64:
if ( columnValue.contains(this.searchString)) {


Das Problem ist, der Fehler laesst sich reproduzieren, soll heissen, er passiert jedes Mal; allerdings nicht an der gleichen Stelle.

Mal ist es bei Ausgabe des Datensatzes 500, mal bei Ausgabe des DS 300

Was mir aufgefallen ist, ist das die ProzessorLeistung jedes Mal kurzzeitig  auf 98-100% ansteigt und dann wieder auf 
unter 10% abfaellt.


Gibt es eine bessere Moeglichkeit als contains zu ueberpruefen, ob Buchstaben in einem String enthalten sind?


Danke Dir nochmals


----------



## ms (13. Sep 2007)

Wenn in Zeile 64 eine NullPointerException auftritt, dann wird wohl ein Objekt null sein, auf dem du eine Methode ausführen willst. Finde erstmal raus welches Objekt das ist. Kleiner Tipp: kann es sein, dass ein String in der Spalte einen Null-Value beinhaltet und das Ergebnis vielleicht nicht immer in der selben Sortierung vorliegt?

ms


----------



## FenchelT (13. Sep 2007)

ms hat gesagt.:
			
		

> Wenn in Zeile 64 eine NullPointerException auftritt, dann wird wohl ein Objekt null sein, auf dem du eine Methode ausführen willst. Finde erstmal raus welches Objekt das ist. Kleiner Tipp: kann es sein, dass ein String in der Spalte einen Null-Value beinhaltet und das Ergebnis vielleicht nicht immer in der selben Sortierung vorliegt?
> 
> ms



Hallo ms,

das hatte ich bereits geprueft.
Es gibt keine NullValues. Es sind alles aktive  Kunden. Ich filtere nach Orten. Alle Kunden haben Orte, sonst koennen Sie gar nicht angelegt werden.
Wie ich eingangs geschrieben habe wird der Datensatz trotz dieser Exception angezeigt.
Ich haette das ja auch verstanden wenn dann Ende waere, aber es werden noch alle weiteren DS angezeigt.


----------



## ms (13. Sep 2007)

Klingt nach einem try-catch-Block der innerhalb der Schleife sitzt.
Zeig mal deinen Code.

ms


----------



## FenchelT (13. Sep 2007)

Hier der relevante Code

Meine Filter Klasse:


```
public class MyFilter implements Predicate
{
	private String searchString = null;
	private String columnName = null;

	
	public MyFilter(String searchString, String columnName)
	{
		this.searchString = searchString;
		this.columnName = columnName;
	}
	
	


	public boolean evaluate(RowSet rs) 
	{
		
		if (rs == null) 
		{
			System.out.println("Debug1");
			return false;
		}
		
		
		FilteredRowSet frs = (FilteredRowSet) rs;
		boolean evaluation = false;
		
		
		try 
		{
			//System.out.println("Debug2");
			String columnValue = frs.getString(this.columnName);
  
			if (columnValue.contains(this.searchString)) 
			{
				evaluation = true;
			}
		
		} 
		catch (SQLException e) 
		{
			/*
			System.out.println("evaluate: " +e.getMessage() + "\n" + e.getStackTrace());
			e.getNextException();
			System.out.println("evaluate: " +e.getMessage() + "\n" + e.getStackTrace());
			*/
			
			
			while (e != null) 
			{
				System.err.println(e.toString());
				System.err.println("SQL-State: " + e.getSQLState());
				System.err.println("ErrorCode: " + e.getErrorCode());
				e = e.getNextException();
			}
				  
			
			return false;
		}
		
		
		return evaluation;
	}

}
```


Mein Testcode:


```
public void init()
	{
		String sql ="select id, name, plz, ort from tabelle where loekz = 'N' ";
		String searchString = "Berlin";
		String searchColumnName = "ort";
		
		int intCounter = 1;
		
		this.frs = this.rec.getFilteredRowSet(sql);
		MyFilter filter = new MyFilter(searchString, searchColumnName);
		
		try
		{			
			this.frs.beforeFirst();
			this.frs.setFilter(filter);
			
			
			while(!this.frs.isLast())
			{
				this.frs.next();
				
				System.out.println("Datensatz " + intCounter + "   KLNR = " + this.frs.getInt("id"));
				System.out.println("------------------------------");
				
				System.out.println(this.frs.getString("name")+ ", ");
				System.out.print(this.frs.getString("plz") + ", ");
				System.out.print(this.frs.getString("ort"));
				
				System.out.println("\n");
				
				intCounter++;
			
			}
			
		}
		
		
		catch (SQLException e) 
		{
			
			while (e != null) 
			{
			    System.err.println(e.toString());
			    System.err.println("SQL-State: " + e.getSQLState());
			    System.err.println("ErrorCode: " + e.getErrorCode());
			    e = e.getNextException();
 		  	}
 		  	
		}
	}
```


Und hier noch die Methode getFilteredRowSet:


```
public FilteredRowSet getFilteredRowSet(String sql)
	{
		
		try
		{
			
			this.stmt = this.cn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
			this.rs = this.stmt.executeQuery(sql);
			
			this.frs = new com.sun.rowset.FilteredRowSetImpl();
			this.frs.populate(this.rs);
			
			//this.frs.first();
		
			
			return this.frs;
			
		}
		catch(Exception e)
		{
			System.out.println(e);
			return null;
		}
		
	}
```

Danke fuer Deine Unterstuetzung


----------



## ms (13. Sep 2007)

Bitte prüfe in Zeile 64 ob columnValue == null ist. In deinem geposteten Code ist das jetzt die Zeile 36.

ms


----------



## FenchelT (13. Sep 2007)

So, habe nun mit isEmpty() geprueft ob der String null ist.
Wenn dann System.exit(0);

Laeuft weiterhin mit Fehler durch. Hier ein Ausschnitt aus der Ausgabe:


Datensatz 892   ID = 1134802
------------------------------
Klinik für Psychiatrie und Psychotherapie, 
12099, Berlin



Datensatz 893   ID = 1142357
------------------------------
KlinikException in thread "main" java.lang.NullPointerException
	at test.FilteredRowSet.MyFilter.evaluate(MyFilter.java:64)
	at com.sun.rowset.FilteredRowSetImpl.internalNext(Unknown Source)
	at com.sun.rowset.CachedRowSetImpl.next(Unknown Source)
	at test.FilteredRowSet.MainCtrl.init(MainCtrl.java:43)
	at test.FilteredRowSet.MainCtrl.<init>(MainCtrl.java:19)
	at test.FilteredRowSet.Start.main(Start.java:30)
 für Innere Med. VII, 
13353, Berlin



Datensatz 894   ID = 1155912
------------------------------
Abt. Kinder- u. Jugendmedizin, 
13589, Berlin


----------



## ms (13. Sep 2007)

FenchelT hat gesagt.:
			
		

> So, habe nun mit isEmpty() geprueft ob der String null ist.


Falsch.
Diese Methode prüft, ob der String die Länge 0 hat.
Wenn der String aber null ist wird bei Aufruf dieser und aller anderen Methoden eine NullpointerException geworfen.
Du musst mit columnValue == null prüfen. 

ms


----------



## FenchelT (13. Sep 2007)

ms hat gesagt.:
			
		

> FenchelT hat gesagt.:
> 
> 
> 
> ...



Manchmal sieht man vor lauter Verzweiflung den Wald vor Baeumen nicht.
Natuerlich muss mit == geprueft werden   

So und nun meine Frage an Dich, wohnst DU im Rheinland? Dann bekommst Du ein Bier von mir  :applaus: 
Man ist manchmal so blockiert im Kopf.

Es war tatsaechlich so, dass der Ort NULL war.
Da ich dies per se ausgeschlossen hatte, haette ich darauf niemals geprueft.

Orte sind immer dann NULL wenn Abteilungen in der gleichen Strasse im selben Ort untergebracht sind, wie die Haupteinrichtung.

Ich wollte die Abteilungen aber gar nicht selektieren.
So ist das, wenn man zu Testzwecken mal eben nen SQL zusammentippert  :autsch: 

if (alter > 30)
{
     new alles_wird_anders();
}



Ich danke Dir vielmals fuer Deine Muehe.


Herzliche Gruesse
FenchelT


----------



## ms (13. Sep 2007)

Bitte, keine Ursache.
Hab die Erfahrung gemacht, dass es in 99% aller Problemfälle an wirklich einfachen Dingen liegt.
Wenn NullpointerException dort steht, dann ist es auch eine.  

Grüsse aus Wien
ms


----------

