# NullPointerException bei Outputwriter



## JSFneuling (9. Nov 2011)

Hallo,

im Moment mache ich eine Anwendung mit JSF und verwende nur SessionScoped ManagedBeans. Eine Fehlermeldung soll nicht für die gesamte Session sondern nur für einen Request existieren:

Mein Ansatz: Ich versuche die Fehlermeldung in den Outputstream der Response zu schreiben.

```
errorMessage = "You have to be logged in to insert books";
       
        ResponseWriter out = FacesContext.getCurrentInstance().getResponseWriter(); // funktioniert
        try {
            out.write(errorMessage); // Die NullPointerException fliegt hier
        } catch (IOException ex) {
            Logger.getLogger(Books.class.getName()).log(Level.SEVERE, null, ex);
        }
```

Ich versteh nicht wo die NullPointer herkommt, da der Writer in Ordnung ist und die errorMessage nicht null.

Viele Grüße


----------



## Atze (9. Nov 2011)

bist du sicher, dass beide nicht null sind? hast du einen trace?


----------



## JSFneuling (9. Nov 2011)

Hallo,

ja ich bin mir sicher, weil die NullPointer meiner Meinung nach schon beim Zuweisen des ResponseWriter fliegen müsste wenn damit was nicht in Ordnung ist und die errorMessage ja hier
	
	
	
	





```
errorMessage = "You have to be logged in to insert books";
```
 direkt drüber zu gewiesen wird.

Der Ort der NullPointer war aus dem StackTrace ersichtlich.

Nach einigem runprobieren bin ich auf folgenden funktionierenden Code gekommen:


```
errorMessage = "You have to be logged in to insert books";
       
        HttpServletResponse out = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
        try {
            out.getWriter().write(errorMessage);
        } catch (IOException ex) {
            Logger.getLogger(Books.class.getName()).log(Level.SEVERE, null, ex);
        }
```

Die Fehlermeldung wird wie gewollt ausgegeben, allerdings als erstes auf der Seite. Gibt es eine Möglichkeit zu kontrollieren wo der writer ausgegeben werden soll?

Warum funktioniert es so? Warum kann ich nicht den direkten ResponseWriter hernehmen? Was hat es mit dem ExternalContext auf sich?

Viele Grüße


----------



## JSFneuling (9. Nov 2011)

Was ist ein trace?


----------



## Atze (9. Nov 2011)

ein stacktrace, fehlermeldungen usw.

woher weißt du denn, dass eine nullpointer fliegt. und woher weißt du, dass es genau DA ist?


----------



## SlaterB (9. Nov 2011)

zu Teilfragen:
> ja ich bin mir sicher, weil die NullPointer meiner Meinung nach schon beim Zuweisen des ResponseWriter fliegen müsste

> FacesContext.getCurrentInstance().getResponseWriter();
kann null zurückgeben, dabei gibts doch kein Problem, 
erst wenn dann auf dieses vermeinlichte Objekt, tatsächlich null, zugreifst, dann kommt die Exception


> Was ist ein trace? 
die Liste der aufgerufenen Methoden hin zur Fehlerposition
etwa

```
java.io.FileNotFoundException: fred.txt
        at java.io.FileInputStream.<init>(FileInputStream.java)
        at java.io.FileInputStream.<init>(FileInputStream.java)
        at ExTest.readMyFile(ExTest.java:19)
        at ExTest.main(ExTest.java:7)
```
Java stack trace - How to print a stack trace to debug Java exceptions | devdaily.com


----------



## JSFneuling (9. Nov 2011)

Hallo,

danke an die Möglichkeit, dass null zurückgegeben werden kann hab ich nicht gedacht. 
Die Abkrüzung trace für Stacktrace kannte ich nicht. In dem hab ich nachgeschaut und es ist angegeben in welcher Zeile meines Programms die NullPointer Exception fliegt.

Viele Grüße


----------



## Atze (9. Nov 2011)

dann musst du an der stelle mit nem debugger durch und schauen ob out o.ä null ist, oder du prüfst vor dem zugriff auf null


----------



## JSFneuling (9. Nov 2011)

Hallo,

danke meine Variable out ist null. Damit ich selbst steuern kann wohin meine Fehlermeldung geschrieben wird habe ich folgendes probiert:


```
HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
        
              
        request.setAttribute("errorMessage", errorMessage);
```

Das Problem dabei ist, dass ich das gesetzte Attribut nicht über die EL erreichen kann. (Ein normales Attribut des ManagedBeans nehm ich nicht her, weil es sich dabei um SessionScope handelt, der für eine Fehlermeldung hinderlich ist)

Mein Versuch das Attribut auszulesen sieht so aus:

[XML]value="${facesContext.currentInstance.externalContext.request.getAttribute("errorMessage")}"[/XML]

Problem: bis request wird mir alles angeboten, das Attribute allerdings nicht mehr, da die Methode getRequest ein Object zurückliefert(siehe oben nötiger Typcast). Gibt es eine Möglichkeit das gesetzte Attribute mithilfe der EL auszulesen?

Viele Grüße


----------



## JSFneuling (9. Nov 2011)

Hallo,

die Lösung ist:

mittels der EL kann das Attribut mit:

${Attributname}

verwendet werden.

Viele Grüße

PS: Für mich ist das Problem damit gelöst. Danke für eure Hinweise


----------

