在使用JSP空间的技术人员,会经常在调试的时候遇到错误
NullPointerException 空指针异常
ClassNotFoundException 无法找到指定的类异常
这2个异常出现的频率太高了,如果能仔细看的话,异常信息连那一行都给你指出来了,自己直接去看源代码不就行了
以tomcat为例。 jsp文件会先被tomcat的 jspc 翻译成 .java文件,一个servlet, 然后再javac 编译成.class文件
异常信息一般有2种大类
1 源代码错误
复制内容到剪贴板代码:
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 24 in the jsp file: /viewthread.jsp
Syntax error, insert ";" to complete Statement
21: }
22: if(post.getIdParent()>0){
23: %>
24: <script type="text/javascript">self.location="viewthread.jsp?tid=<%post.getIdParent()%>";</script>
25: <%
26: return;
27: }
Stacktrace:
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:85)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.
可以看到在第24行,出现了无法编译的问题,经检查,那个<%post.getIdParent()%>少了等于号 <%=post.getIdParent()%>
这类错误因为错误信息和源代码逐行对应,所以比较好找。
2 运行错误
复制内容到剪贴板代码:
HTTP Status 500 -
--------------------------------------------------------------------------------
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:512)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:395)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
java.lang.NullPointerException
java.math.BigDecimal.compareTo(BigDecimal.java:2406)
com.goodtp.sales.html.Order.getOrderItem(Order.java:146)
com.goodtp.sales.html.HtmlOrder.saveOrder(HtmlOrder.java:214)
org.apache.jsp.saler.saveOrder_jsp._jspService(saveOrder_jsp.java:180)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
这个错误最常见,请注意如下这一行
org.apache.jsp.saler.saveOrder_jsp._jspService(saveOrder_jsp.java:180)
错误在 saveOrder_jsp.java 的 180行, 怎么找到这个文件呢
这个文件就在 tomcat/works/ 目录下面,你可以在这个目录下面搜索文件,就能找到saveOrder_jsp.java
打开后,找到 180行,就可以看到到底是哪里出了问题了。
对于eclipse集成Tomcat调试的, 这个文件不在 tomcat目录下面,而是在
eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work
实在找不到,就全盘搜索,一般也就1-3分钟的事情。
问题找到了,怎么调试呢?
我们假设你没有用过log工具,我们现在就用最简单的 System.out.println() 来做
比如NullPointerException, 那证明那一行的调用方法的对象是null,
int id = order.getId(); //
你可以修改成
System.out.println("order="+order);
int id = order.getId();
运行,你就能在控制台看到
order=null 的输出,从而确定 order并没有被正确的赋值。
然后以这里为起点,逐步往前面查找,看看到底是哪里给order赋值的。比如找到
Order order = orderService.find(orderId);
这也许是因为 orderId对应的order根本没有啊,也许是orderId取错了参数。
修改为
System.out.println("orderId="+order);
Order order = orderService.find(orderId);
运行,输出为
orderId=35
查看数据库,如果不存在35号数据,可以肯定参数错误,如果存在,可以肯定是 orderService.find() 方法里面出现了问题。查进取
这就是最基本的jsp调试方法.
对于java应用,比如Swing, Eclipse提供了集成单步调试工具,就更方便了。
随着经验的积累,就会很快的找到问题的原因,而且同样的错误,你也会降低极大的再次出现的几率