遗留系统的异常处理办法
背景
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实例。所以遗留系统里面的问题就是写了大量的没有异常处理机制的代码,既没有自主处理异常,也没有抛出异常,告知调用者
可能会出现的异常,通过上述的四个方法基本上可以找到问题点,解决之。