# hartnäckige NullPointer Exception in Servlet - wieso finde.



## Guest (1. Feb 2005)

. ich den (Denk-) Fehler nicht?

Hallo!

Typisches Anfängerproblem: finde den Grund einer NullPointerException nicht. Gehe ich den Code prozedural durch, so wie das Programm abläuft (also mit Auskommentieren des jeweils nächsten Abschnittes), so funktioniert der Code. Doch kaum lasse ich den Code, komplett auf einmal ausführbar, bis zu einem gewissen Punkt kommen, kommt die Exception - wie soll ich da den Fehler nur finden.

Ich geb hier mal den Code an:

einmal den Teil der Servlet Klasse bis das Problem entsteht:

```
res.setContentType("text/html");
PrintWriter out = res.getWriter();
	
	
	infHeaderLoop = new Information(out);
	
	int t = infHeaderLoop.servletTreeEvaluation(req);
	
	
	switch (t)
	{
		
		
		case 1: infHeaderLoop.resolutionTo();break;

       
                case 2: infHeaderLoop.toSession(req);break;
		
	}
```

//Annahme request ist null (aber nur wenn ich Code komplett auf einmal einblende)-  wenn ich das ganze prozedural einblende und am Browser mitverfolge - funktionierts seltsamer Weise

Hier die Hilfsklasse mit den aufgerufenen Methoden 


```
public void resolutionTo()
	{
		
		out.println("<head><script type='text/javascript'>" +
		"window.location.href = './hello?pass=n&sw=\'+screen.width+\'&sh=\'+screen.height+\'';"+
		"</script></head>");

	}
	
	public void toSession(HttpServletRequest req)
	{
		
		HttpSession hs = req.getSession();
		hs.setAttribute("sw", req.getParameter("sw"));
		hs.setAttribute("sh", req.getParameter("sh"));
		
		out.println(
		"<script type='text/javascript'>" +
		"window.location.href = './hello?pass=y';"+
		"</script></head><body>");
		
	}
	
	
	public int servletTreeEvaluation(HttpServletRequest req)
	{
		int tree=0;
		
		
		if(req.getParameter("pass") == null)
		{
			tree = 1;
		
			
		}
		
	
		if(req.getParameter("pass").equals("n")) //hier wird nullpointerexception angezeigt
		{
			tree = 2;
			
		}
		
	
		return tree;
		
	}
```

ich nehme an, daß das Übergeben von request die heikle Sache ist, aber ich steck irgendwie fest.

vielleicht kann jemand von hier einen kurzen Blick drauf werfen  :meld:


----------



## Guest (1. Feb 2005)

Kein Wunder. Wenn req.getParameter("pass") == null ist, darfst du nicht req.getParameter("pass").equals(...) machen. 

So ist es korrekt.
	
	
	
	





```
public int servletTreeEvaluation(HttpServletRequest req) 
{ 
  int tree=0; 
       
  if(req.getParameter("pass") == null) 
  { 
    tree = 1; 
  } 
  ELSE if(req.getParameter("pass").equals("n")) //hier wird nullpointerexception angezeigt 
  { 
    tree = 2; 
  } 
  return tree; 
}
```


----------



## Guest (1. Feb 2005)

... also funktionieren tuts jetzt jedenfalls. Kannst du mir noch kurz helfen meine Denkprobleme aufzulösen, weil ganz sonnenklar ist mir das nicht. der Unterschied zwischen if und else if

also bei else if ist der Unterschied, daß er gar nicht mehr den requestWert "pass" abfragt - im Gegensatz zu if wo er ihn noch abfragt und feststellt, daß die Bedingung in zweiten Fall, falls null, nicht zutrifft.

aber wieso darf man das nicht? - wenn ein bestimmter requestWert einmal ausgelesen ist, - existiert er dann nicht mehr (das könnte ich jetzt auch selbst überprüfen  :shock? - oder liegt meine blockade wo anders?


----------



## bambi (1. Feb 2005)

Also wenn du schreibst

```
String somethinng = null // mal angenommen der Wert ist null

if (something.equals("whatever") { ... }
```

dann wirft equals() eine NullPointerException.

Deswegen nimmst Du else if ... Wenn dann naemlich der Wert null ist, dann rufst Du equals gar nicht mehr auf und bekommst auch keine Exception.


----------



## Bleiglanz (2. Feb 2005)

deshalb hier zum x.ten mal der Tipp

=> konstante ausdrücke nach links!


```
if(req.getParameter("pass").equals("n"))
```
wirft ne NPE wenn nix da ist


```
if("n".equals(req.getParameter("pass"))
```
ist false, wenn nix da ist; das ist meistens besser und bequemer


----------



## Guest (2. Feb 2005)

bleiglanz, du hast meine Blockade gesprengt


----------



## Bert Brenner (2. Feb 2005)

Alternativ kann man auch direkt mit return die Methode an geeigneter stelle verlassen. Wenns verwirren sollte guck schnell weg. 



```
public int servletTreeEvaluation(HttpServletRequest req) {

  if(req.getParameter("pass") == null)
    return 1;
  
  if(req.getParameter("pass").equals("n"))
    return 2;

  return 0;

}
```


----------

