Asynchrones Servlet löst NullPointerException aus

jupper

Aktives Mitglied
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

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
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
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.

Code:
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

Top Contributor
Hast du den Code von FotoService hier gekürzt? Laut StackTrace fliegt sonst hier:
Java:
            ex.printStackTrace();
die NullPointerException. Das wäre schon recht ungewöhnlich.
 

jupper

Aktives Mitglied
Hey,

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

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.
Java:
out.write("false");
 

jupper

Aktives Mitglied
Ok, habe das Problem jetzt selbst gelöst, in dem ich in SellServlet die Zeile
Java:
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

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Jakarta Servlet API 5.0 Allgemeines EE 1
pkm Frage wegen AJAX-Zugriff auf ein Servlet Allgemeines EE 1
Dimax Servlet Servlet Kommunikation Allgemeines EE 18
K Unterschied zwischen JSP & Servlet gegenüber REST mittels JAX-RS Allgemeines EE 1
Dimax Servlet läuft in Eclipse, aber nicht im Browser Allgemeines EE 74
M URL Servlet Request getParameter Allgemeines EE 2
M Servlet Methoden Aufruf im Servlet Allgemeines EE 10
J 404 Not found (Servlet) Allgemeines EE 1
E Servlet Servlet das richtige? Allgemeines EE 11
B HTTP-Header-Inspektor-Servlet Allgemeines EE 1
N JSP Servlet mit JSP ansprechen Allgemeines EE 2
F Mehrere Bilder aus MySQL DB via Servlet darstellen. Allgemeines EE 1
J FTP und Servlet Allgemeines EE 11
H Post an Servlet Allgemeines EE 2
A Binärdatei vom Servlet erzeugen lassen Allgemeines EE 3
S Servlet Authentication Filter Allgemeines EE 0
S LDAP JAAS oder Servlet Allgemeines EE 0
G Problem: Servlet in JSP einbinden mit <jsp:include> Allgemeines EE 3
F eigene Anwendung per Servlet Container starten Allgemeines EE 9
F Servlet Daten im Speicher ablegen Allgemeines EE 3
L Servlet ClassNotFoundException Servlet Allgemeines EE 3
G Allgemeine Frage zu Authentifizierung mittels Servlet API Allgemeines EE 2
J Servlet "package does not exist" Allgemeines EE 5
K Servlet-Mapping Allgemeines EE 9
0 Servlet mit ArrayList Allgemeines EE 3
E Servlet unter mehreren Adressen Allgemeines EE 16
S Pfad-Zugriff über Servlet-init() Allgemeines EE 2
E Servlet Wie kann ich ohne Hilfe von Eclipse in JBoss mein servlet aufrufen Allgemeines EE 2
S Servlet.service() threw exception Allgemeines EE 4
A Servlet erkennt request Objekt nicht Allgemeines EE 8
G Direkter Zugriff auf Servlet- doPost Allgemeines EE 15
G Servlet doGet, doPost Allgemeines EE 3
A Kodierungsproblem bei Parameterübergabe von Browser an Servlet (GET) Allgemeines EE 2
Antoras servlet-mapping auf dynamische URLs Allgemeines EE 17
0 Problem mit librarys javax.servlet.http.HttpServletRequest cannot be resolved Allgemeines EE 1
MQue Ajax - Servlet Allgemeines EE 2
MQue Servlet Allgemeines EE 9
S [Design] Dynamischer EJB Aufruf von Servlet Allgemeines EE 3
S Servlet auf JBoss 5? Allgemeines EE 11
B HttpSession bekommen wenn nicht in Servlet Allgemeines EE 8
MQue Servlet / Button Allgemeines EE 5
S In Eclipse werden die "Servlet-Klassen" nicht gefu Allgemeines EE 2
U javax.faces und javax.servlet cannot be resolved Allgemeines EE 2
W Potentielles Memory Leak bei Servlet Allgemeines EE 6
B unterschied servlet und bean Allgemeines EE 2
Escorter Servlet .sar und jede Menge .jar Archive Allgemeines EE 2
N Servlet und JSF (URL-Rewriting)? Allgemeines EE 3
A jsf: Servlet aufrufen, wie geht das? web.xml Fehler? Allgemeines EE 13
N Servlet zyklisch aktualisieren Allgemeines EE 2
zilti Verbindung Applet <-> Servlet Allgemeines EE 5
ARadauer Servlet Bild Rückgabe Allgemeines EE 2
I Über Formular Daten zu Servlet Allgemeines EE 36
H Servlet - Zwischenmeldung anzeigen bei längerer Berechnung Allgemeines EE 2
G Ordner mit Umlauten einlesen - Servlet Allgemeines EE 3
A web.xml für Servlet in Tomcat 5.5 erstellen Allgemeines EE 2
M Zwei Buttons in einem Servlet Allgemeines EE 2
M Servlet lässt sich nicht aufrufen Allgemeines EE 6
A web.xml für Servlet in Tomcat erstellen Allgemeines EE 6
B Servlet Allgemeines EE 3
G EJB - EJB wird nicht ins Servlet geladen Allgemeines EE 3
K load-on-startup -> in der Servlet Klasse Allgemeines EE 6
G Objekt an Servlet übergeben - oder Objekt global definieren? Allgemeines EE 4
W Was bei Servlet-Entwicklung alles beachten? Allgemeines EE 8
R Zugriff auf Filter Servlet Allgemeines EE 10
I JBOSS Jsp Files Pfad im Servlet? Allgemeines EE 4
N Servlet-Request abbrechen? Allgemeines EE 3
D Java Servlet mit Radio Buttons Allgemeines EE 2
G Servlet debugging Allgemeines EE 8
N Thread von Servlet aus starten Allgemeines EE 16
N JSP: Collection im Servlet überwachen (mit AJAX)? Allgemeines EE 5
J Socket daten darstellen per jsp,servlet Allgemeines EE 2
W servlet über https Allgemeines EE 2
L Servlet kann Funktion nicht aufrufen Allgemeines EE 3
B Parameterübergane von Servlet an JSP funktioniert nicht ? Allgemeines EE 2
M Aus einem Servlet auf ein anderes zugreifen ? Allgemeines EE 2
G Servlet Serializable Allgemeines EE 2
B Servlet-Api.jar auf JBoss? (Migration von Tomcat zu JBoss) Allgemeines EE 4
H Servlet - Importieren von Code Allgemeines EE 2
P Java Servlet - Umgang mit Verlinkungen Allgemeines EE 7
M Wert aus Servlet an normale Klasse übergeben Allgemeines EE 2
E Servlet soll JFRame öffnen. Jframe.setvisible schlägtfehl Allgemeines EE 2
M servlet --> jsp - problem beim umstrukturieren Allgemeines EE 5
D Servlet Problem über Server Allgemeines EE 26
K Servlet per Formular aufrufen Allgemeines EE 8
L sessions mit servlet oder jsp ? Allgemeines EE 9
B JSF - Servlet mit Parametern über einen Link öffnen Allgemeines EE 3
D Binärdaten im Servlet entgegen nehmen, aber wie? Allgemeines EE 5
T Servlet-Instanzen und ServletContext Allgemeines EE 2
L speichern von daten mittels servlet in xml Allgemeines EE 8
N Collection überwachen (Servlet + AJAX) Allgemeines EE 3
N Liste mit Checkboxen an Servlet übergeben? Allgemeines EE 3
T Wie Datenbank und Servlet koppeln? Allgemeines EE 3
G Ladeseite anzeigen lassen während das Servlet noch arbeitet? Allgemeines EE 6
P Tomcat Servlet POST Daten als Array Allgemeines EE 2
P PDF per Servlet übertragen, danach keinen Inhalt mehr Allgemeines EE 12
N JSP kann Servlet nicht aufrufen! :-( Allgemeines EE 2
J Servlet Parameter aus web.xml übergeben, wie zugreifen? Allgemeines EE 2
L servlet.jar ? Allgemeines EE 2
K Servlet: Respone.redirect mit POST-Parametern Allgemeines EE 5
S kann eigenes object nicht von applet zu servlet senden Allgemeines EE 3

Ähnliche Java Themen

Neue Themen


Oben