0x663

0x663

天地有大美而不言
github
steam
bilibili
discord server
youtube
douban
twitter
nintendo switch

System.exit(status) 异常捕获

前言#

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
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。