# Asynchrones Servlet löst NullPointerException aus



## jupper (26. Mai 2017)

Hallo zusammen,

ich beschäftige mich gerade mit Java EE und lese dazu gerade ein Buch, in dem wird ein Onlineshop nach und nach gebildet. Mit Hilfe der Seite sell.html werden Beschreibung, Name, Preis und ein Bild hochgeladen und an SellServlet.java weitergegeben, der wiederum gibt das Abspeichern des Bildes an FotoService weiter. Hier mal der Quellcode.

sell.html


```
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="css/styles.css">
        <title>Onlineshop</title>
    </head>
    <body>
        <header>
            <hgroup>
                <h1 class="title">Onlineshop</h1>
            </hgroup>
            <nav>
                <a href="index.html">Home</a>
                <a href="register.html">Registrieren</a>
                <a href="signin.html">Einloggen</a>
                <a href="sell.html">Verkaufen</a>
                <a href="search.html">Suchen</a>
            </nav>
        </header>
        <form action="sell" method="post" enctype="multipart/form-data">
            <fieldset>
                <legend>Verkaufen</legend>
                <table>
                    <tbody>
                        <tr>
                            <th>
                                <label for="title">Titel</label>
                            </th>
                            <td>
                                <input
                                    type="text"
                                    name="title"
                                    size="40"
                                    maxlength="40"
                                    title="Ein Titel für den Artikel"
                                    placeholder="Titel eingeben"
                                    pattern=".{6,40}"
                                    required="required">
                            </td>
                        </tr>
                        <tr>
                            <th>
                                <label for="description">Beschreibung:</label>
                            </th>
                            <td>
                                <textarea name="description" rows="10" cols="100" maxlength="1000"></textarea>
                            </td>
                        </tr>
                        <tr>
                            <th>
                                <label for="price">Preis:</label>
                            </th>
                            <td>
                                <input
                                    type="number"
                                    name="price"
                                    size="40"
                                    maxlength="40"
                                    title="Ein Preis für den Artikel"
                                    placeholder="Preis eingeben"
                                    pattern=".{1,40}"
                                    required="required">
                            </td>
                        </tr>
                        <tr>
                            <th>
                                <label for="foto">Foto:</label>
                            </th>
                            <td>
                                <input type="file" name="foto">
                            </td>
                        </tr>
                        <tr>
                            <td/><td>
                                <input type="reset">
                                <input type="submit">
                            </td>
                        </tr>
                    </tbody>
                </table>
            </fieldset>
        </form>
        <footer>
            Copyright
        </footer>
    </body>
</html>
```

SellServlet.java

```
package de.java2enterprise.onlineshop;

import java.io.IOException;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = {"/sell"}, asyncSupported = true)
@MultipartConfig(maxFileSize = 1024*1024*10, maxRequestSize = 1024*1024*30)
public class SellServlet extends HttpServlet {
   
    private static final long serialVersionUID = 1L;
   
    public void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
        final AsyncContext ac = request.startAsync();
        ac.start(new FotoService(ac));
        ac.complete();
    }
}
```
FotoService.java

```
package de.java2enterprise.onlineshop;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.AsyncContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

public class FotoService implements Runnable{
   
    private AsyncContext ac;
   
    public FotoService( AsyncContext ac) {
        this.ac = ac;
    }
   
    @Override
    public void run() {
       
        final HttpServletRequest request = (HttpServletRequest) ac.getRequest();
        final HttpServletResponse response = (HttpServletResponse) ac.getResponse();
       
        InputStream is = null;
        OutputStream os = null;
        PrintWriter out = null;
       
        try {
            final Part part = request.getPart("foto");
            os = new FileOutputStream(part.getSubmittedFileName());
            is = part.getInputStream();
            out = response.getWriter();
           
            byte[] b = new byte[1024];
            int i = 0;
            while ((i = is.read(b)) != -1) {
                os.write(b, 0, i);
            }
            os.flush();
            out.write("true");
            ac.complete();
        } catch (Exception ex) {
            out.write("false");
            ex.printStackTrace();
        } finally {
            try {
               
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
       
    }
   
}
```

Wenn ich dann auf der HTML Seite die Felder ausfülle und ein Bild auswähle und es abspeichern will, komme ich auf eine leere Seite. In der Konsole wird folgende Meldung ausgegeben.


```
2017-05-26T06:21:19.550+0200|Severe: Exception in thread "glassfish-web-async-thread-8"
2017-05-26T06:21:19.550+0200|Severe: java.lang.NullPointerException
    at de.java2enterprise.onlineshop.FotoService.run(FotoService.java:48)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
```


----------



## stg (26. Mai 2017)

Hast du den Code von FotoService hier gekürzt? Laut StackTrace fliegt sonst hier:

```
ex.printStackTrace();
```
die NullPointerException. Das wäre schon recht ungewöhnlich.


----------



## jupper (26. Mai 2017)

Hey,

ich habe den Code noch bearbeitet und die falsche Fehlermeldung kopiert, bzw. die von einer früheren Version vom Code.


```
2017-05-26T06:46:35.281+0200|Severe: Exception in thread "glassfish-web-async-thread-10"
2017-05-26T06:46:35.282+0200|Severe: java.lang.NullPointerException
    at de.java2enterprise.onlineshop.FotoService.run(FotoService.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
```

D.h. die Exception wird hier ausgelöst. 

```
out.write("false");
```


----------



## jupper (26. Mai 2017)

Ok, habe das Problem jetzt selbst gelöst, in dem ich in SellServlet die Zeile 

```
ac.complete();
```
War wohl heute Morgen noch zu müde.

Eine Kleinigkeit ist mir aber noch aufgefallen. out wird ja erst mir null initialisiert. Im try Block wird dann response.getWriter() zugewiesen. Im catch Block wird out.write("false") benutzt. Gibt das nicht auch eine NullPointerException weil out in dem Bereich ja auch null ist?


----------



## stg (27. Mai 2017)

Dort auf out zuzugreifen ist gefährlich, ja. (out _ist _nicht null aber _kann_ null sein.)
Eventuell kannst du die try-Blöcke anders schachteln. Das try-catch im finally-Teil bringt ja im Moment ohnehin nix.


----------



## jupper (27. Mai 2017)

Ok, danke!


----------

