遗留系统的异常处理办法

遗留系统的异常处理办法

背景

OA7.0是一个跨度较大的版本,拷贝了客户生产环境的webapp/resources/data 就可以在本地搭建其测试环境。
根据客户的二开策略,我修改了数据源等个性化配置信息后遇到了些问题:
1.启动报各种异常导致无法启动成功
2.启动成功后,使用用户名和密码都无法登录成功
在这种情形下,就要进入具体的报错点,熟悉类的加载过程。

java.lang.NoClassDefFoundError: Could not initialize class org.springside.core.Constants

Oracle 的解释是:
Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.
The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

当java虚拟机或者类加载器实例尝试加载定义的类时,却没有找到该类的定义。

解决思路

注释法


类会先加载static块,采用二分法的方式注释一部分方法调用,看问题是否存在。

日志法


生产环境的问题无法debug,但是可以通过详细的日志调用,知道执行了哪些问题。

反编译法


因为jar包里面的代码无法打断点,可以将类反编译出来,jdk会优先调用classes目录的字节码。

异常定位法


既然是抛出了异常导致启动不成功,那么异常是哪里引起的,可以通过增加try…catch来捕获异常,定位异常点,记录异常信息。

最终解决

原来是Constants类调用了Lisences.jar里面的方法导致抛出异常而没有处理,导致程序异常中断,static块没有执行完成,类加载器无法
初始化Constants实例。所以遗留系统里面的问题就是写了大量的没有异常处理机制的代码,既没有自主处理异常,也没有抛出异常,告知调用者
可能会出现的异常,通过上述的四个方法基本上可以找到问题点,解决之。