新手提升JSP技术能力的一点建议-调试篇

最近又发现了许多人提问JSP里面遇空指针的问题,突然想起我还不是小版主时,就写过一个类似的文章。不过那时没有引起太大的反向,也就冷清了。今天利用【特权】加为精华。

同时将此文发布到博客上,希望对初学者掌握一定的调试技巧有帮助。

原文地址:http://www.java2000.net/viewthread.jsp?tid=223

论坛地址:http://topic.csdn.net/u/20080107/09/30190cef-a255-43ac-ad78-4e5201791019.html?seed=1724603974

声明:此文为2008年1月7日的帖子,部分内容在我以后发布的帖子中出现了。此文可以看作陈年老帖了。

一 如何快速提升自己的技术能力
做项目。 自己假设的也算。

比如你要做一个论坛,像CSDN 这样的。 在制作过程中,你会遇到非常多的困难。 
你的代码结构也会变动很多次,我说的是结构,代码就变动更多了。 
遇到问题,首先到搜索引擎上去搜索,我只去google,可以确定一点,

你绝对不是第一个遇到这个问题的人,也不是最后一个。 

只有自己通过努力思考,搜索,最终掌握的东西才真正是自己的。  
自己实在想不通,也找不到(因为不会找,而不是没有),再到论坛,QQ什么的,找其它人帮忙 
问题也会局限在某个技术点上,毕竟你已经自己思考过了,别人稍微一点拨,你就会豁然开朗的。 
那些直接问,这个功能怎么做啊的,基本都不是自己认真思考过的,否则他只会问,谁知道XXX的地方,怎么弄才能达到YYY的效果? 

另外,英文是不不可少的,看到那么多人带着异常来求救,真是.... 


二 关于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提供了集成单步调试工具,就更方便了。


  随着经验的积累,你会很快的找到问题的原因,而且同样的错误,你也会降低极大的再次出现的几率。

三 ClassNotFoundException 的解决方法
  classpath问题,对于jsp,最大的可能是因为你的jar没有放对地方,对于tomcat 有2个地方可放
  a) tomcat/shared/lib 目录 tomcat 5.5版本 或者 tomcat/lib目录 tomcat6版本 
  b) 你的应用的 WEB-INF/lib 目录 推荐放在这里。

  如果你不确认需要哪些jar,就把hibernate随包带的都复制过去就行了。 虽然不推荐,但对于初学者,也是一个临时的解决方法


四 最常见的几种问题和解决方法
  1 字符串的== 判断,应该用 equals() 进行
  2 ResultSet 使用前忘了 rs.next();
  3 数据库连接没有放在 finally{} 里面关闭
  4 没有判断每个方法的返回值,造成程序隐患





<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值