网上的一些调试,大都是关于Eclipse下的java调试,但是新手在接触动态页面时往往会因为一个逗号,括号的原因而报错。这个时间调试就显得极其重要,问老师后写下此篇简单图文调试。
背景:新闻发布系统用户上传和添加图片功能时报错
操作步骤:1->进入上传图片页面
操作步骤:2->点击选择文件,上传图片后如下所示(比如xxx.jpg)
操作步骤:3->点击选择按钮上传图片后如下(比如xxx.jpg)
结果:上传图片未成功,Myeclipse下Console显示报错,原因如下,这里关于Java.lang.NumberFormatException问题的分析思路来源于:https://blog.csdn.net/duyusean/article/details/81183384
不在赘述解决思路,(可详细翻阅以上链接查看),此篇着重于Debug,报错信息提示我们在NesAddPicServlect的76行有错
开始Debug:首先我们的tomcat会是Run状态,我们在准备Debug时首先应当停止其服务,再设置断点,随后以debug的状态启动tomcat,图文操作如下
1:查看tomcat服务(Run状态)
2:停止tomcat服务,右键Tomcat 7.x,点击Stop Server,结果如下(我表示还不会截那个状态图。。。先用文字凑合下)
3:未设置断点之前(看24行最左边蓝色的竖状区域状态)
4:开始设置断点(鼠标左键双击24行最左边的蓝色区域会出现一个小圆点,代表断点),即程序会从断点处开始debug
5:tomcat以debug状态启动,右键Tomcat 7.x,点击Debug Server,结果如下
6:接下来重复操作步骤1和2(注意不是Debug里面的1、2!),我们会看到MyEcplise有响应,进入MyEcplise
7:Eclipse弹出窗口,点击yes
8:Debug页面如下(不要慌,不需要看全部的英文,看keyword,比如我们的错误是null,那么我们只需要在Varibles界面里面看看哪个变量为空值即可,也就是keyword->null)
9:主要使用这三个按钮,一般自己写的方法选择Step Into,遇到什么System.out.println()之内的系统自带的,就选择Step Over
参考来源:https://www.cnblogs.com/cat80/p/eclipse-debugging-beginning.html
用命不是蛮规范,为了好记,我觉得直接翻译好些
1)Step Into F5 进入 如有方法则进入。快捷键F5()
2)Step Over F6 跨过 但遇到方法如果方法 内无断点则不会进行方法。快捷键F6
3)Step Return F7退出当前调试方法 ,返回被调用的方法。快捷键F7
10:我们开始Step over,一边观察程序执行到了哪里,一边找我们的keyword,null,执行到75行,还没有执行76行代码时,我们的变量状态是这样的,可以发现并没有null的出现,页面也可以继续运行下去,只不过没有出现我们想要的结果。(PS:想让窗口最大化只需要双击左键即可,使其从最大化变为一般状态时,同理双击左键)
11:Step over执行76行报错,我们可以想到是id值未取到
int id = Integer.parseInt(request.getParameter("id"));//取不到id 可是前面一个页面能够取到id值 = = 解决!
可利用System.out.println("图片test2" + request.getParameter("id"));来检验id是否为空,结果发现为null值,会在MyEclipse的控制台显示,此时我们返回到newsAddPic.jsp的页面查看其id值(newsAddPic.jsp页面的逻辑是由NewsAddPicServlet控制的,也就是说NewsAddPicServlet的值是从newsAddPic.jsp提交的数据中获取的,即id源于newsAddPic.jsp)
12:可以看到newsAddPic.jsp也会取到id值,此时我们在20行在添加一个断点配合System.out.println()进行调试(正在进行调试的时间->点击红色按钮终止调试->添加断点->run debug)
红色按钮如下
13:调试进入newsAdd.jsp页面(首先进入newsAdd.jsp,再进入NewsAddPicServlet),可以发现id不为空,那么我们现在只需要考虑传输的时间是否带了id值进去,也就是我们由序号1->序号2的操作,发现问题所在!
14:代码更改如下(注意此时去掉newsAdd.jsp里面的断点,只保留NewsAddPicServlet里面的断点)
15:继续测试NewsAddPicServlet,可发现76行安全执行
16:成功!(注意76行后面的语句进入了内部或者次数太多,可以使用Step return或者直接关闭debug,使用run状态执行检验)
尾声:序号1表示MyEclipse示图,序号2表示MyEcplise示图,左键点击即可切换