【问题标题】:JSP NullPointer StandardWrapperValve[servlets. ]: Servlet.service() for servlet servlets. threw exception java.lang.NullPointerExceptionJSP NullPointer StandardWrapperValve[servlets. ]: Servlet.service() 用于 servlet servlet。抛出异常 java.lang.NullPointerException
【发布时间】:2014-08-16 01:57:44
【问题描述】:

我正在尝试学习如何使用 JSP。我遇到了一些没有意义的事情,至少在我看来:

当我尝试运行时:

response.getWriter().println(m.getDb().printAll());

我在尝试加载相关页面时收到此信息:

2014-08-16T03:19:59.789+0200|Warning: StandardWrapperValve[servlets.GUI]: Servlet.service() for servlet servlets.GUI threw exception java.lang.NullPointerException
at servlets.GUI.doGet(GUI.java:39)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)

在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 在 java.lang.Thread.run(Thread.java:744)

但是当我跑步时:

response.getWriter().println(m.getOut());

输出是正确的。

两者都应该返回相同的结果,因为

class M
{
 String out = "";

 private OjectDAO db = new ObjectDAO()

 public M()
 {
   db.addAll(TextFileLoader(getServletContext().getRealPath("textfile.xml"))); 
 }


 ...
        System.out.println(db.printAll());
        out=db.printAll();
 ...
     public String getOut()
     {
      return out;
     }
 ...
}

class ObjectDAO
{

 ...
 public String printAll()
 {
  String result = "";
  for (WrappedItem item : locDB )
  {
   result = item.toString() + result + "\n";
  }
  return result;
 }
  ...
}

为什么,在一种情况下有 NullPointer,而在另一种情况下则没有?

更多细节: 应用程序在 Eclipse Luna 部署的 Glassfish 4 上运行。操作系统:Debian 应用程序将文本从文件加载到 DAO 并尝试将它们从 DAO 加载到 JSP 中。 xml 的路径似乎正确。

P.S.:起初我认为这是一个 BuildPath 问题,因为我之前遇到过类似的事情,并且在我将 JDom2.jar 添加到 WEB-INF/lib 后解决了,但坦率地说,我看不出我可以在哪里添加这次是一个罐子。有趣的是:即使有这两个问题,STDOUT 的输出也能无缝工作。

附录 1

如上所述,我的问题是:

response.getWriter().println(m.getOut());

工作正常。

response.getWriter().println(m.getDb().printAll());

没有。

这两行都放在servlet“GUI.java”文件中。 唯一的区别,至少在我看到多少粘液方面是: 在第一种情况下,我在字符串通过类 M 中的字符串变量后打印字符串,在第二种情况下,我尝试直接打印它。

这就是全部区别。

附录 2

添加了完整的堆栈跟踪。

Servlet:通用代码,唯一的区别是

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
    System.out.println("Started ");
    response.getWriter().println("<h1> Header1 </h1>");
    response.getWriter().println("<body> Funny body text </body>");
    System.out.println(getServletContext().getRealPath("data.xml"));
    serverJava.Monitor m = new serverJava.Monitor(getServletContext().getRealPath("data.xml"));
    response.getWriter().println("<br> I say:" + m.printHello());
    response.getWriter().println(m.getOut());
    response.getWriter().println(m.getDb().printAll());
}

现在人们开始之前:下面的代码只是为了测试,是否一切正常。它真的不会留下来。

public M(String s) 
{
    try
    {
        XMLFileWrapper xml = new XMLFileWrapper(s);
        DataDAO db = new DataDAO();
        db.loadFromHDD(xml.retrieveWrappedRootDataFromXML());
        System.out.println(db.printAll()); <<<< This yealds output
        out=db.printAll(); 
    }catch(Exception e){
        e.printStackTrace();
    }
}

public DataDAO getDb() 
{
    return db;
}

public String getOut()
{
    return out;
}

.

public class DataDAO 
{

    public void loadFromHDD(LinkedList<Item> list)
    {
        locDB.addAll(list);
    }

    public String printAll()
    {
        String result = "";
        for (Item item : locDB )
        {
        result = item.toString() + result + "\n";
        }
    return result;
    }

}

DataDAO 从 JDom2 对象中检索内容...虽然我怀疑它与它有什么关系,但方法如下:

public LinkedList<Item> retrieveWrappedRootDataFromXML()
{
    LinkedList<Item> result = new LinkedList<Item>();

    for ( Element e : getRoot().getChildren() )
    {
        Item item = new Item();
        item.setInfoId(e.getAttributeValue("id"));
        item.setName(e.getChildText("name"));
        item.setShortName(e.getChildText("short"));
        item.setUser(e.getChildText("user"));
        result.add(item);
    }
    return result;
}

【问题讨论】:

  • “有趣的是:即使有这两个问题,STDOUT 的输出也能无缝运行。” - 你确定你部署正确吗?在职的?那个“有趣的事情”暗示你实际上并没有运行你认为正在运行的代码。
  • 我确实浏览了该项目,但没有发现任何迹象表明我正在运行错误的代码......但像往常一样,我可能错了。关于我可能忽略的任何提示?
  • 我会把每条指令放在自己的行上,然后再试一次/使用带有NullPointerException断点的调试器。

标签: java jsp


【解决方案1】:

让我们从逻辑上解决这个问题。

以下语句可以(理论上)抛出NullPointerException,原因如下:

  response.getWriter().println(m.getDb().printAll());
  1. responsenull
  2. response.getWriter() 返回null
  3. mnull
  4. m.getDb()null

我们可以从 JSP 规范中删除 1 和 2。 (除非你做了一些真正离奇的事情......)

根据以下陈述,我们可以(暂时)消除 3 个:

  response.getWriter().println(m.getOut());

在(我假设)类似的环境中工作。这意味着m 不是null。 (尽管鉴于您的问题中的证据存在其他不准确之处,我们无法确定...)

剩下 4 是最可能的原因。检查您是否正确实施了getDb();例如确保它返回的ObjectDAO 值不能是null


请注意,我们无法确定任何,因为您问题中的代码 sn-ps 显然是“虚构的”。它们包含编译器会拒绝的明显拼写错误。因此,我们不能相信它们实际上与您的 JSP 中的实际代码有很多相似之处。


更新

既然您已经发布了 M 类的完整代码,那么 NPE 的原因就跳到我头上了!

getDb() 方法返回 null,因为 db 未初始化。

“但是”我听到你说“它是!!”

哦,不,不是!您将new DataDAO() 分配给局部变量db,而不是this.db


教训:当无可争辩的逻辑告诉你bug的原因一定是X时,争论是没有意义的......

【讨论】:

  • 嗯...实际上...就是这样。两者都没有发生。 sn-ps 是“虚构的”,因为我只需要对这一奇怪事件进行解释。 M 不为空。控制台中的输出每次都会显示数据。我试图通过简单地将项目源复制到另一个项目中来检查大约 16 小时,并且它可以无缝工作。这就是我如此惊讶的原因[这就是我在谷歌的额外帮助下发现缺少的库的原因] ...因为在添加库之后/或多或少/是我到达的。请参阅 OP 中的附录 1。
  • 如果我从表面上看你的证据,没有其他合乎逻辑的解释。如果您希望我进一步调查,您需要提供 SSCCE;即一个小型 JSP + Java 类,其行为与您描述的一样,其他人可以运行......以查看发生了什么。
  • 如果您提供完整的堆栈跟踪信息也会有所帮助。
  • 添加了我能想到的所有内容... 附录 2
  • 顺便说一句,这不是 SSCCE。代码仍然不是独立的。我们仍然需要添加一些东西以使其可执行。不过没关系,我可以看出问题所在。
【解决方案2】:

在我的情况下,我输入错误,例如。 productDAO proddao;,应该是productDAO proddao= new productDAO();,程序可以运行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2015-03-06
    • 1970-01-01
    • 2021-09-02
    • 2014-02-09
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多