webForumDet fria alternativet

Nullpointerexception fel

7 svar · 415 visningar · startad av Choronzon

ChoronzonMedlem sedan aug. 20011 346 inlägg
#1

Försöker köra ett exempel med en servlet med netbeans 4.0 men får följande fel. Nån som vet vad jag missat?

2005-01-19 07:52:18 StandardWrapperValve[Flip]: Servlet.service() for servlet Flip threw exception
java.lang.NullPointerException
    at org.me.coin.Flip.processRequest(Flip.java:58)
    at org.me.coin.Flip.doPost(Flip.java:82)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:595)

Och rad 595 ser ut såhär

    public void run() {
	if (target != null) {
	    target.run();    /* <--595 */
	}
    }

På själva sidan ser felmesset ut såhär:

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

java.lang.NullPointerException
	org.me.coin.Flip.processRequest(Flip.java:58)
	org.me.coin.Flip.doPost(Flip.java:82)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:362)

note The full stack trace of the root cause is available in the Apache Tomcat/5.0.28 logs.

--------------------------------------------------------------------------------

Apache Tomcat/5.0.28

Jag kan köra jsp-sidor, men kan inte köra servlets verkar det som. Tips mottages tacksamt

Edit..
Inkluderar Flip.java också, eftersom det är den som stoppas i början

package org.me.coin;

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Random;

public class Flip extends HttpServlet {
    private Random generator = new Random();
    
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }
    private int flipCoin() {
        return Math.abs(generator.nextInt() % 2);
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        HttpSession session = request.getSession();
        TossesBean tossesInfo = (TossesBean) session.getAttribute("tossesInfo");
        if ("Reset".equals(request.getParameter("action"))) {
            tossesInfo.reset();
        } else {
            int result = flipCoin();
            if (result == 0) {
                tossesInfo.setHeads(tossesInfo.getHeads() + 1); /*[b] <-- Rad 58*/[/b]
            } else {
                tossesInfo.setTails(tossesInfo.getTails() + 1);
            }
        }
        RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
        rd.forward(request, response);
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response); /*[b]<-- Rad 82*/[/b]
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "My Description of the servlet";
    }
    
}
antilizaerMedlem sedan apr. 200357 inlägg
#2

Du ska snarare titta på rad 58 i Flip.java det där felet uppstår. Det som skrivs ut är alla olika metodanrop som skett innan felet där det sista anropet (där det blir fel) är överst.

Felet beror på att det inte finns någon TossesBean klass lagrad i sessionen, så tossesInfo är null när följande kod anropas på rad 58:

tossesInfo.setHeads(tossesInfo.getHeads() + 1);
ChoronzonMedlem sedan aug. 20011 346 inlägg
#3

Tack för svar! Ska jag importera något mera då, eller vad gör jag för att lösa det? Ska väl inte behövas import eftersom det rör sig om samma package heller? Jag kanske gjort nåt annat fel iofs..

Bifogar båda filerna:

/*
 * Flip.java
 *
 * Created on January 19, 2005, 7:21 AM
 */

package org.me.coin;

import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

[b]import org.me.coin.TossesBean; /*???*/[/b]

import java.util.Random;

public class Flip extends HttpServlet {
    private Random generator = new Random();
    
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }
    private int flipCoin() {
        return Math.abs(generator.nextInt() % 2);
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        HttpSession session = request.getSession();
        TossesBean tossesInfo = (TossesBean) session.getAttribute("tossesInfo");
        if ("Reset".equals(request.getParameter("action"))) {
            tossesInfo.reset();
        } else {
            int result = flipCoin();
            if (result == 0) {
                tossesInfo.setHeads(tossesInfo.getHeads() + 1);
            } else {
                tossesInfo.setTails(tossesInfo.getTails() + 1);
            }
        }
        RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
        rd.forward(request, response);
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "My Description of the servlet";
    }
    
}
/*
 * TossesBean.java
 *
 * Created on January 19, 2005, 7:20 AM
 */

package org.me.coin;

import java.beans.*;
import java.io.Serializable;

public class TossesBean extends Object implements Serializable {
    
    private PropertyChangeSupport propertySupport;
    
    /**
     * Holds value of property heads.
     */
    private int heads;
    
    /**
     * Holds value of property tails.
     */
    private int tails;
    
    /**
     * Holds value of property pct_heads.
     */
    private double pct_heads;
    
    /**
     * Holds value of property pct_tails.
     */
    private double pct_tails;
    
    public TossesBean() {
        propertySupport = new PropertyChangeSupport(this);
        this.reset();
    }
    
    
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertySupport.addPropertyChangeListener(listener);
    }
    
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertySupport.removePropertyChangeListener(listener);
    }
    
    /**
     * Getter for property heads.
     * @return Value of property heads.
     */
    public int getHeads() {
        
        return this.heads;
    }
    
    /**
     * Setter for property heads.
     * @param heads New value of property heads.
     */
    public void setHeads(int heads) {
        this.heads = heads;
        setPcts();
    }
    
    /**
     * Getter for property tails.
     * @return Value of property tails.
     */
    public int getTails() {
        return this.tails;
    }
    
    /**
     * Setter for property tails.
     * @param tails New value of property tails.
     */
    public void setTails(int tails) {
        this.tails = tails;
        setPcts();
    }
    
    /**
     * Getter for property pct_heads.
     * @return Value of property pct_heads.
     */
    public double getPct_heads() {
        
        return this.pct_heads;
    }
    
    /**
     * Setter for property pct_heads.
     * @param pct_heads New value of property pct_heads.
     */
    public void setPct_heads(double pct_heads) {
        
        this.pct_heads = pct_heads;
    }
    
    /**
     * Getter for property pct_tails.
     * @return Value of property pct_tails.
     */
    public double getPct_tails() {
        
        return this.pct_tails;
    }
    
    /**
     * Setter for property pct_tails.
     * @param pct_tails New value of property pct_tails.
     */
    public void setPct_tails(double pct_tails) {
        
        this.pct_tails = pct_tails;
    }

    public void reset() {
        setHeads(0);
        setTails(0);
    }
    
    private void setPcts() {
        if (this.heads > 0 || this.tails > 0) {
            if (this.heads == 0) {
                this.pct_tails = 1.0;
            } else if (this.tails == 0) {
                this.pct_heads = 1.0;
            } else {
                this.pct_heads = ((1.0 * this.heads) / (this.heads + this.tails));
                this.pct_tails = ((1.0 * this.tails) / (this.heads + this.tails));
            }
        } else {
            this.pct_heads = 0.0;
            this.pct_tails = 0.0;
        }
    }
    
    
}
ChoronzonMedlem sedan aug. 20011 346 inlägg
#4

När dom i övningen säger:

*Replace the processRequest method body with the following code:

HttpSession session = request.getSession();
   TossesBean tossesInfo = (TossesBean) session.getAttribute("tossesInfo");
   if ("Reset".equals(request.getParameter("action"))) {
       tossesInfo.reset();
   }
   else {
       int result = flipCoin();
       if (result == 0) {
           tossesInfo.setHeads(tossesInfo.getHeads() + 1);
       }
       else {
           tossesInfo.setTails(tossesInfo.getTails() + 1);
       }
   }
   RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
   rd.forward(request, response);
ersätter jag alltså detta:
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
        /* TODO output your page here
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet</title>");
        out.println("</head>");
        out.println("<body>");
         
        out.println("</body>");
        out.println("</html>");
         */
            out.close();
     }

Med detta??

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        

        HttpSession session = request.getSession();
        TossesBean tossesInfo = (TossesBean) session.getAttribute("tossesInfo");
        if ("Reset".equals(request.getParameter("action"))) {
            tossesInfo.reset();
        } else {
            int result = flipCoin();
            if (result == 0) {
                tossesInfo.setHeads(tossesInfo.getHeads() + 1);
            } else {
                tossesInfo.setTails(tossesInfo.getTails() + 1);
            }
        }
        RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
        rd.forward(request, response);
        

        out.close();
    }
antilizaerMedlem sedan apr. 200357 inlägg
#5

Nä du behöver inte importera något mer. Du måste anropa någon annan servlet eller jsp-sida som stoppar in ett TossesBean objekt i sessionen innan du anropar din servlet.

Skulle tror att det finns någon .jsp sida i exemplet som skapar ett TossesBean och lägger in den i sessionen på rätt attribut namn ("tossesInfo").

ChoronzonMedlem sedan aug. 20011 346 inlägg
#6

Ja, index.jsp ser ut såhär och jag kan ladda sidan, däremot blir det ju fel när jag submitar den

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html>
    <head><title>JSP Page</title></head>
    <body>
<jsp:useBean id="tossesInfo" scope="session" class="org.me.coin.TossesBean" />
<form action="Flip" method="post">
     <table>
        <tr>
           <th align="left">
               <font color="${(tossesInfo.heads) gt (tossesInfo.tails) ? 'green' : 'red'}">
                Heads
               </font>
           </th>
           <td><fmt:formatNumber value="${tossesInfo.heads}"/></td>
	   <td><fmt:formatNumber value="${tossesInfo.pct_heads}" type="percent" /></td>
        </tr>
        <tr>
           <th align="left">
               <font color="${(tossesInfo.tails) gt (tossesInfo.heads) ? 'green' : 'red'}">
               Tails
               </font>
           </th>
	   <td><fmt:formatNumber value="${tossesInfo.tails}"/></td>
           <td><fmt:formatNumber value="${tossesInfo.pct_tails}" type="percent" /></td>
       </tr>
       <tr>
           <td align='center'>
              <input type="submit" name="action" value="Flip Coin">
           </td>
           <td></td>
           <td align='center'>
              <input type="submit" name="action" value="Reset">
           </td>
       </tr>
    </table>
    </form> 
    </body>
</html>
antilizaerMedlem sedan apr. 200357 inlägg
#7

Vet tyvärr inte vad som är fel, tycker allt ser ut som det ska men det är väl något jag missar. Verkar vara som att servern tappar sessionen mellan anropen, det är inte så att du har cookies avstängt i din webläsare, även sessions cookies. Antingen det eller så kanske det är någon inställning i Tomcat 5.x som måste göras, har inte använt Tomcat 5.x så vad vet jag tyvärr inte

ChoronzonMedlem sedan aug. 20011 346 inlägg
#8

Ok, tack. Får testa lite inställningar..

139 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)