Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Servlet -> NullPointerException -> Perchè?

    Ho scritto una servlet che gestisce il login di un sito. Se i campi NON sono vuoti, funziona perfettamente. Se invece almeno uno rimane bianco (vuoti ma non nullo), mi lancia la NullPointerException.

    Questa è la Servlet:

    codice:
    package servlets;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import utils.HashPass;
    
    import db.DBConnection;
    import db.Database;
    
    import beans.Order;
    import beans.User;
    
    /**
     * Servlet implementation class BeerSelect
     */
    public class LogIn extends HttpServlet {
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
    	 *      response)
    	 */
    	protected void doPost(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html");
    		DBConnection conn = new DBConnection();
    		conn.connectDB();
    		Database database = new Database(conn);
    		String userName = (String) request.getParameter("username");
    		String password = (String) request.getParameter("password");
    		boolean wrongInput = userName != null && userName.equals("") && password != null && password.equals("");
    		
    		User anUser = null;
    		if (!wrongInput) {
    			anUser = database.getUser(userName, HashPass.hashPassword(password));
    		}
    		
    		HttpSession session = request.getSession(true);
    
    
    		ServletContext context = getServletContext();
    		RequestDispatcher dispatcher = null;
    
    		if (anUser != null && anUser.isLoggedIn()) {
    			session.setAttribute("order", new Order());
    			session.setAttribute("user", anUser);
    			database.setLastAccess(anUser.getUserName());
    			Cookie user = new Cookie("username", userName);
    			Cookie passw = new Cookie("password", password);
    			user.setMaxAge(60);
    			passw.setMaxAge(60);
    			response.addCookie(user);
    			response.addCookie(passw);
    			dispatcher = context.getRequestDispatcher("/home?page=usercp");
    		} else {
    			dispatcher = context.getRequestDispatcher("/home?page=loginError");
    		}
    
    		dispatcher.forward(request, response);
    	}
    
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		doPost(request, response);
    	}
    
    }
    E questa è l'eccezione:

    codice:
    SEVERE: Servlet.service() for servlet jsp threw exception
    java.lang.NullPointerException
    	at org.apache.jsp.en.fail_005flogin_005fen_jsp._jspService(fail_005flogin_005fen_jsp.java:68)
    	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
    	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    	at servlets.Main.doPost(Main.java:82)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    	at servlets.LogIn.doPost(LogIn.java:67)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    	at java.lang.Thread.run(Thread.java:636)
    Jul 20, 2011 10:22:33 PM org.apache.catalina.core.ApplicationDispatcher invoke
    SEVERE: Servlet.service() for servlet Main threw exception
    java.lang.NullPointerException
    	at org.apache.jsp.en.fail_005flogin_005fen_jsp._jspService(fail_005flogin_005fen_jsp.java:68)
    	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
    	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    	at servlets.Main.doPost(Main.java:82)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    	at servlets.LogIn.doPost(LogIn.java:67)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    	at java.lang.Thread.run(Thread.java:636)
    Jul 20, 2011 10:22:33 PM org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet Login threw exception
    java.lang.NullPointerException
    	at org.apache.jsp.en.fail_005flogin_005fen_jsp._jspService(fail_005flogin_005fen_jsp.java:68)
    	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
    	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    	at servlets.Main.doPost(Main.java:82)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    	at servlets.LogIn.doPost(LogIn.java:67)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    	at java.lang.Thread.run(Thread.java:636)
    Non riesco a capire come mai.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    se tu invece di scrivere "" (lasciarlo vuoto) scrivi " " hai che

    codice:
    String tmp = ""; 
    String tmp2 = " ";
    String tmp3 = ""; 
    
    System.out.println(tmp.equals(tmp2)); //FALSE
    System.out.println(tmp.equals(tmp3)); //TRUE
    System.out.println(tmp.trim().equals(tmp2.trim())); //TRUE
    quindi dovresti controllare che il trim non sia bianco, questo probabilmente genera l'eccezione dopo

  3. #3
    ...scusa ma che cambia da "" a " ", a parte che una è una stringa vuota e l'altra è una stringa con uno spazio bianco? Comunque io non è che dichiaro una stringa, ma è il campo username o password del login form che resta bianco, quando un utente clicca LOGIN.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    a te che guardi non cambia niente, per java in un caso hai una stringa a lunghezza 0 e in un altro hai una stringa a lunghezza 1 che in realtà contiene un solo spazio bianco.

    Visto che chiami in causa il database devi essere sicuro che non ci siano problemi con query in cui uno dei campi ha valore non valido

    Molto spesso (specie nelle login) o quando si fanno query se uno dei campi di interesse è vuoto non lo si include nella query, quindi dovresti avere campi VALIDI per poter fare la query

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Aggiungo anch'io alcune considerazioni in merito alla prima parte di codice che ho letto:

    1) getParameter() dell'oggetto HttpServletRequest ritorna già un oggetto String, quindi il cast è del tutto inutile.

    2) Questa riga di codice non ha molto senso:

    codice:
    boolean wrongInput = userName != null && userName.equals("") && password != null && password.equals("");
    Guardando solo alle prime due espressioni booleane in AND:

    codice:
    (userName != null) && (userName.equals(""))
    Che succede se userName è nullo? Risposta: tutta l'espressione booleana sarà falsa. Quindi per te uno userName nullo NON RAPPRESENTA un valore errato.

    Stessa identica considerazione per la variabile "password".

    Ergo... se per caso userName o password sono nulli (basta anche solo uno dei due) tu vai a fare la query sul DB.

    PS: se l'utente lascia in bianco un campo è molto probabile che quel campo NON venga inviato nella request, quindi getParameter() ritorna proprio null.

    Rivedi quella condizione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Se uno dei 2 è nullo, ho già try e catch che mi cattura l'eccezione e mi reindirizza ad una pagina di errore.
    In effetti controllado la riga per l'assegnazione di wrongInput noto che non ha senso. L'ho riscritta, ma non cambia. Penso ci sia un parametro nullo da qualche parte e non lo trovo.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    come l'hai riscritta?

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e non fare troppo affidamento ai try catch, perché sollevare un'eccezione (e gestirla) quando puoi preventivamente non fare l'operazione e richiedere un valore valido?

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Tra parentesi, quell'eccezione viene lanciata da una JSP, non dalla servlet che la richiama... Quindi c'è qualcosa che non va all'interno della JSP, dovresti postarne il codice.

    Comunque, aspetto di vedere il codice aggiornato anche della Servlet, altrimenti non sappiamo come sta evolvendo la situazione.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Eccomi:

    codice:
    public class LogIn extends HttpServlet {
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
    	 *      response)
    	 */
    	protected void doPost(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html");
    
    		String userName = (String) request.getParameter("username");
    		String password = (String) request.getParameter("password");
    
    		boolean wrongInput = userName == null || password == null;
    		DBConnection conn = new DBConnection();
    		conn.connectDB();
    		Database database = new Database(conn);
    
    		User anUser = null;
    
    		anUser = database.getUser(userName, HashPass.hashPassword(password));
    
    		HttpSession session = request.getSession();
    
    		ServletContext context = getServletContext();
    		RequestDispatcher dispatcher = null;
    		if (!wrongInput) {
    			session.setAttribute("order", new Order());
    			session.setAttribute("user", anUser);
    
    			if (anUser.isLoggedIn()) {
    
    				database.setLastAccess(anUser.getUserName());
    				Cookie user = new Cookie("username", userName);
    				Cookie passw = new Cookie("password", password);
    				user.setMaxAge(600000);
    				passw.setMaxAge(600000);
    				response.addCookie(user);
    				response.addCookie(passw);
    				dispatcher = context.getRequestDispatcher("/home?page=usercp");
    				dispatcher.forward(request, response);
    			} else {
    				dispatcher = context
    						.getRequestDispatcher("/home?page=loginError");
    				dispatcher.forward(request, response);
    			}
    		} else {
    			dispatcher = context.getRequestDispatcher("/err");
    			dispatcher.forward(request, response);
    		}
    		conn.disconnectDB();
    
    	}
    
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		doPost(request, response);
    	}
    
    }

    Ho controllato lo stacktrace, e in effetti come dici tu, il problema sta in una JSP. Ora vado a controllare.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.