我正在尝试学习如何使用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)
at 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而在另一种情况下没有NullPointer?
更多细节: 应用程序在Eclipse Luna部署的Glassfish 4上运行。操作系统:Debian 应用程序将文本从文件加载到DAO,并尝试将它们从DAO加载到JSP中。 xml的路径似乎是正确的。
PS:起初我认为这是一个BuildPath问题,因为我之前遇到过类似的东西,一旦我将JDom2.jar添加到WEB-INF / lib就解决了,但坦率地说我看不到我可以添加的地方这次是一个罐子。有趣的是:即使遇到这两个问题,STDOUT的输出也能无缝地工作。如上所述,我的问题是:
response.getWriter().println(m.getOut());
工作正常。
response.getWriter().println(m.getDb().printAll());
没有。
这两行都放在servlet“GUI.java”文件中。 唯一的区别,至少我看到的是: 在第一种情况下,我在通过M类中的String变量后打印String,在第二种情况下,我尝试直接打印它。
这就完全不同了。
添加了完整的堆栈跟踪。
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;
}
答案 0 :(得分:3)
让我们从逻辑上接近这一点。
以下陈述可以(理论上)抛出NullPointerException
,原因如下:
response.getWriter().println(m.getDb().printAll());
response
是null
。response.getWriter()
返回null
m
是null
m.getDb()
是null
我们可以从JSP规范中消除1和2。 (除非你做了一些真正奇怪的事情......)
我们可以(暂时)在此基础上消除这个陈述:
response.getWriter().println(m.getOut());
在(我假设)一个类似的上下文中工作。这意味着m
不是null
。 (虽然鉴于你的问题中的证据存在其他不准确之处,但我们无法确定......)
留下4是最可能的原因。检查您是否已正确实施getDb()
;例如确保它返回的ObjectDAO
值不能为null
。
请注意,我们无法确定任何,因为您的问题中的代码段显然是“虚构的”。它们包含编译器拒绝的明显拼写错误。因此,我们不能相信它们实际上与JSP中的实际代码有很多相似之处。
更新
现在您已经发布了M
课程的完整代码,NPE的原因只是跳到了我的页面!
getDb()
方法返回null
,因为db
未初始化。
“但是”我听到你说“它是!!”。
哦不,不是!您要将new DataDAO()
分配给本地变量db
,而不是this.db
。
课程:当无可争议的逻辑告诉你错误的原因必须是X时,争辩就不值得......
答案 1 :(得分:0)
在我的情况下,我错误地输入了例如。 productDAO proddao;
,应为productDAO proddao= new productDAO();
,并且程序可以正常工作