System.exit(status) 异常捕获

前言

TopicCommand.main(args)
在通过 zookeeper 去执行 kafka 的创建 topic 命令时碰到的一个问题，在开源工具的代码内部最终执行创建 topic 的时候会去做一个 System.exit(0) 的操作，这样就会导致我们的 JVM 被终止掉，这个时候我们又无法去修改工具代码，所以可以换个角度尝试去捕获 System.exit(status)

实现

继承 SecurityManager 这个类，来自 java.lang
然后重写 checkExit(int status) 这个方法

Copy
static class DemoSecurityManager extends SecurityManager {
@Override public void checkExit(int status) {
throw new SecurityException();
}
}

在调用会执行 System.exit(status) 的代码块前加入这个代码，并 try-catch 这段代码

Copy
@Test
void testMain() {
System.out.println("startMain");
DemoSecurityManager demoSecurityManager = new DemoSecurityManager();
System.setSecurityManager(demoSecurityManager);
try {
main(new String[]{});
} catch (Exception e) {
System.err.println("跳过退出错误的方法，继续执行");
}
System.out.println("endMain");
// 防止内存溢出
System.setSecurityManager(null);
}

public static void main(String[] args) {
System.out.println("testMain");
System.exit(0);
}

这样最终执行结果为

Copy
startMain
testMain
endMain