前言#
TopicCommand.main(args)
在使用 zookeeper 執行 kafka 的建立 topic 命令時遇到的一個問題是,在開源工具的程式碼內部最終執行建立 topic 的時候會執行 System.exit(0),這導致我們的 JVM 被終止,而我們又無法修改工具程式碼,因此可以嘗試捕獲 System.exit(status)。
實現#
繼承 SecurityManager 這個類別,來自 java.lang
然後重寫 checkExit(int status) 這個方法
static class DemoSecurityManager extends SecurityManager {
@Override public void checkExit(int status) {
throw new SecurityException();
}
}
在執行會執行 System.exit(status) 的程式碼塊之前加入這段程式碼,並且使用 try-catch 包裹這段程式碼
@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);
}
這樣最終執行結果為
startMain
testMain
endMain