当我们还在学 javaSE 的时候, 仿佛感觉调试这个工具离我们很遥远, 因为谈不上有什么难以解决的 bug, 无非就是一些空指针异常, 书写上少写了一个分号, 不小心把 1 写成了小写字母 l 等. 可是到了 web 阶段, 就值得专门写一篇文章讨论这个问题了.
一, Web 前端的乱码问题
之所以把这个列为第一位, 是因为在 Web 前端, 这个 bug 想不遇到都难. 这些 bug 如何解决? 我的方法是分而治之.
情况一: 打开. java 文件, 还没写代码就已经出现乱码.
乱码 1
解决方法:
A:(低级版)将乱码的文字直接删了, 这不失为一种非常好的笨方法;
B:(高级版)点击本文件, 鼠标右击选择 properties, 找到下面这个地方没? 就是这, 一般改成 utf-8 就行了.
解决方案
情况二, 前端输入了汉字, 传到后端服务器出现乱码(或者后端传到前端出现乱码).
讲真, 遇到这种问题最好的办法就是写一个编码过滤器 codeFilter, 以后写项目的时候, 直接将这个文件丢到你的 filter 包里面, 你就可以高枕无忧了. 至于什么是过滤器, 聪明的你一定知道. 当然, 核心代码我是一定要给出来的, 不然显得我不够专业, 哈哈.
过滤器核心代码
情况三, 后端数据传到 MySQL 数据库, 在数据库中出现乱码
聪明的你一定还记得下面这一段代码:
jdbc 连接数据库
此时你只需要添加在后面加上下面这段代码, 百分之九十九就能解决上面问题, 如果不能解决怎么办? 你就要开始怀疑自己的人品了.
设置传入 (传出) 数据库的编码格式
情况四, 在数据库中插入一条带中文的数据时, 存入之后出现乱码
解决方法: 不妨在插入数据之前, 加上这样一条 sql 语句试试? set names "GBK";
二, 你还在重启 tomcat 服务器或者 eclipse 吗?
很多人有时候实在找不到 bug 的时候, 动不动重启服务器或者 eclipse, 有时候确实真的能解决问题, 但是这样真的好吗? 以我多年 (也就两个月) 的找 bug 经验, 除非 eclipse 卡死, 正常情况下是不需要重启 eclipse 的. 所以下次重启 eclipse 之前, 想清楚到底是什么原因导致的.
不过经常重启 tomcat 服务器还是可以理解的, 以我的经验来看, 这两种情况是一定要重启服务器的:
A: 你需要重新发布另一个项目到服务器上, 这时候你不仅需要重启服务器, 为了保险起见, 还要把之前发布的项目从服务器中移除, 否则也会出现出乎意料的问题.
B: 当我们从 jsp 页面跳转到后端 servlet 的时候, 肯定是需要配置路径的, 路径配置好之后, 一定要重启服务器, 否则可能会出现 404 错误. 首先, 你的路径未必是对的, 其次, 服务器之前的缓存记录并没有清除.
三, SQL 语句出现语法错误是什么鬼?
话不多述, 请看下面:
sql 语句错误
上面有两句正确, 两句错误, 你能找出来吗? 如果你能找出来且鬼魅一笑, 说明我懂你. 如果找不出来, 请看下面:
公布结果
当然 SQL 语句还有其他需要注意的地方:
A: 某一项你设置 ID 为自增的时候, 插入一条数据需要注意.
B: 关于 Date 类型, 往往需要注意 java.sql.Date 和 java.util.Date 两种类型的转换.
四, 前端 jsp 需要注意的种种问题
A: 在你写 < c:if></c:if > 的时候一定要想起导入核心标签库, 还要注意到标签库版本的问题, 版本不同也是不起作用的. 还有还有, jstl/core 与 " 之间一定不要有空格, 否则一定会出错!
核心标签库
B: 路径跳转一定要注意相对路径和绝对路径的区别, 强烈建议用绝对路径, 不容易出错.
一般这么写:{pageContext.request.contextPath}/main.do
C: 如果你修改了 CSS 样式, 结果浏览器的呈现的样式并没有发生改变时, 一般你清空一下浏览器缓存就行了.
D: 当你想获取下拉框选中的那个值的时候, 一定不要用 onclick 方法而是用 onchange 方法, 这对我来说是血的教训.
五: 终极版调试经验
为此, 我将 bug 分为七个等级, 分别为倔强青铜, 持续白银, 荣耀黄金, 尊贵铂金, 永恒钻石, 最强王者, 荣耀王者.
倔强青铜: 空指针异常. 如果不知道怎么解决, 复习一下 javaSE.
持续白银: 语法错误. 包括 java 语法, JavaScript 语法, jQuery 语法, MySQL 语法. java 语法和 MySQL 语法错误的话, 看后台报错提示就可以了, JavaScript 和 jQuery 的话, 按 F12 看前端开发人员选项, 也应该能够找出来.
荣耀黄金: 书写错误. 书写错误有时候是特别难找的, 我一个朋友之前不小心把 {pageContext.request.contextPath} 写成了{pagecontext.request.contextPath}, 结果怎么也找不出来, 因为前端调试比后端调试难度大.
尊贵铂金: 前端 JavaScript 中出错. 要求熟练掌握前端开发者人员选项的调试工具, 就可以解决.
永恒钻石: 后端出现逻辑错误. 要求严格掌握后台调试工具.
最强王者: 代码丑陋, 这在我看来也是一种 bug, 因为代码可读性查, 可扩展性弱, 这也算不上好代码, 还不如不写.
荣耀王者: 代码冗长. 当你啥时候能够将长长的代码提炼出来成为一个工具类, 而不必每次写一个同样的功能再把同样的代码写一遍, 大大节省了时间, 你应该就算是 Web 阶段的荣耀王者了.
调试心得: 以我自己个人解决 bug 的经验来看, 如果出现倔强青铜级 bug, 我会会心一笑, 直接锁定报错的那一行, 轻微地修改一下; 如果出现持续白银级 bug, 我会先检查一下语法, 如果一眼看出错误, 直接修改, 如果看不出来, 百度一下, 轻松解决; 如果出现荣耀黄金级 bug, 我会尽快锁定书写错误的位置逐一排查, 可能会慢一点, 但是一定能够找到; 如果遇到尊贵铂金级 bug, 我会优雅地打开开发者人员选项, 用用控制填, 用用 source, 偶尔用用 netWork 看看数据有没有正确传输, 有没有收到返回值等等; 如果遇到后端逻辑错误, 我不会一开始就用调试工具, 因为那样有点浪费时间, 我会先锁定位置, 在那个地方用 System.out.print()输出一下自己怀疑的数据, 如果不是自己想要的, 问题就找到了, 实在解决不了, 一定要用调试工具, 逐步调试, 虽然耗费时间, 但一定能够找到; 至于最后两种, 就需要个人对代码的艺术追求了, 暂且可以不考虑.
本文章并不能详细告诉 Web 前端出现的各种 bug, 但是对你找 bug 的心法一定是大有裨益的. 写文章也只是分享我自己的找 bug 心得, 难免出现疏漏差错之处, 况且我个人能力有限, 希望诸位同仁多多补充, 以便后人乘凉.
来源: http://www.jianshu.com/p/e2c247fdecca