1. 背景介绍
在开发过程中, 遇到平台代码不规范的写法(如下图), 将异常直接吃掉, 或者吞掉了详细堆栈. 当生产运行到这段代码时, 抛出的信息非常少, 而且不知道是哪行代码抛出的异常, 排除问题非常困难. 为解决这个问题, 想到了一个好办法.
2. 解决思路
- 将jdk中的java.lang.Exception类重写. 在本机创建Exception这个类, 并在构造器中将堆栈输出
package java.lang;
public class Exception extends Throwable {
static final long serialVersionUID = -3387516993124229948L;
public Exception() {
super();
this.printStackTrace(); // 将堆栈输出
}
public Exception(String message) {
super(message);
this.printStackTrace();
}
public Exception(String message, Throwable cause) {
super(message, cause);
this.printStackTrace();
}
public Exception(Throwable cause) {
super(cause);
this.printStackTrace();
}
protected Exception(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
this.printStackTrace();
}
}
- 通过javac命令将Exception.java构建, 得到Exception.class
- 再将Exception.class替换到$JAVA_HOME/jre/lib/rt.jar中的对应Execetion类
2. 验证
- 测试类
public class TestUserDefineNullPointerException {
static void f1() {
f2();
}
private static void f2() {
String s = null;
s.length();
}
public static void main(String[] args) {
System.out.println("start...");
try {
f1();
} catch (Exception e) {
// 此处Exception虽然被吃了, 但控制台依然打出了异常堆栈
System.out.println("in..........");
}
}
}
- 控制台输出结果
in..........
at chapter4.TestUserDefineNullPointerException.f2(TestUserDefineNullPointerException.java:11)
at chapter4.TestUserDefineNullPointerException.f1(TestUserDefineNullPointerException.java:6)
at chapter4.TestUserDefineNullPointerException.main(TestUserDefineNullPointerException.java:18)