线上环境,有时候点击会报错,有时候点击不会报错。
1:第一想法,怎么这么奇怪有时候报错有时候不报错。我用线上的测试环境和本地的测试环境跑了几个流程发现根本找不到区问题所在。
2:然后开始去线上找所有的服务器把日志都打开,进行搜索一开始搜索的服务器并没有相关报错的日志信息,继续找
终于在其中一台找到了有该报错信息的日志。一开始先看报错信息 exepct '[' but string 怎么错误提示这么不明显。然后我当时的想法是接着往下看,找到哪里调的方法 的方法名
找到该方法名之后,去本地debug 看看有没有异常。 发现并没有异常,
3:本地发现没事之后,这时候的想法是去把这个 服务器的 class 编译后的类进行反编译和本地代码进行对比看看。
反编译后发现没问题啊,一模一样。还把反编译后的代码本地测试了遍。也没问题,
4:有点郁闷,这时候才开始百度 报错的信息代表什么意思。 我个人觉得遇到问题尽量先不要百度,自己先琢磨琢磨才行。
5:百度之后发现了是 fastjson 解析出现的问题,但是我本地测线上的代码也没解析出错啊。
6:突然顿悟,这段代码中是有去 根据 url 去解析json 的 ,这个url 和端口 是调用服务器本地的 项目,而我们本地没有这个项目,所以解析出来报错,但是可以被正常解析到 ,所以不会去执行 if 判断里面的方法
String httpRs = HttpUtils.httpPost(seriesUrl, json.toString());
AjaxJson ajOne = GoldenhomeGuiderController.getHttpReturn(httpRs);
List<SeriesVO> seriesVOList = new ArrayList();
if (ajOne.isSuccess()) {
seriesVOList = JSONObject.parseArray(JSONObject.toJSONString(ajOne.getBody().get("data")), SeriesVO.class);
但是在这一台服务器这个 url 和端口存在java 项目 ,请求这个项目解析出来肯定是不符合要求的。
也就是进入到了这一行导致的报错!
seriesVOList = JSONObject.parseArray(JSONObject.toJSONString(ajOne.getBody().get("data")), SeriesVO.class);
我把本地请求的 url 和端口改为此服务器的公网 ip 和端口请求这个接口,终于遇到同样的错误了!
总结:下次遇到这类问题的时候,先仔细思考,线上环境有时候有报错,有时候没有。而我们的项目都是用nginx 配置反向代理的,说明是有些服务器有问题,还有第二个 报错信息指的是 fastjson 解析出错,那么日志记录报错的方法源头查看 解析报错的代码在哪里,然后层层往上分析应该就能找到问题的所在了。