前言#
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