上线遇到的版本问题-花了一天时间才解决

来源:互联网 发布:张家辉演技知乎 编辑:程序博客网 时间:2024/06/10 01:32

问题描述:有一个生成二维码的功能,本地和测试都通过,放到预发环境上,接口访问就报错,而且把所有代码都Exception级别catch了,catch中的日志依然没有输出,然而在catch中用return可以生效。说明代码一定抛异常了,但是居然没有catch住。

解决过程:在代码可能出问题的行数都打日志,没有定位到问题。最后在这个接口的每一行上下都加上日志,发现了代码走到其中一行就直接终止了,后面的也没执行,catch中的代码执行了,但是没有打印日志。执行终止的这一句很简单,只是jar中的一句构造方法。而且构造方法是默认的。弄了快到晚上八点了还是没有进展,有同事用反编译去看源码,有同事去找其它生成二维码的方法,还是同事看看预发的jdk版本发现问题所在了。预发的jdk6,本地和测试都是jdk7.可能是这个问题导致的,然后就在本地将版本降为1.6去跑单元测试,果真出现了Exception in thread “main” java.lang.UnsupportedClassVersionError.由于生成二维码的版本3.2要求jdk7,最后查了一下发现将生成二维码的版本降低一下就可以了。即将版本从3.2–>2.3即可

小知识:
1,异常接口图,如果不是这次遇到了Error,然后自己亲手画一遍,都记不清了。
这里写图片描述

2,在《深入理解java虚拟机》中讲到,java的版本是从45开始的,JDK1.1之后的每个JDK大版本发布主板本号向上加1(JDK1.0~1.1使用了45.0~45.3的版本号),高版本的JDK能向下兼容以前版本的class文件,但不能运行以后版本的class文件,即使文件格式未发生任何变化,虚拟机也必须拒绝执行超过其版本号的class文件。

3,为什么jvm拒绝执行超过其版本号的代码时候,业务日志没有打印?(待解决)

小感悟:正常来说,开发,测试,线上环境保持一致,就不会出现这种问题。但是有时候一个人同时做新项目和维护老项目是时候就难免出现类似这种版本不一致出现的奇怪的问题。

提升方法: 1,尝试将jdk统一为1.7或1.8(会排上需求日程)
2,《深入理解java虚拟机》多看