java如何从java内部捕获退出代码?

Posted

技术标签:

【中文标题】java如何从java内部捕获退出代码?【英文标题】:how can java catch exit code from inside java? 【发布时间】:2017-06-13 14:39:35 【问题描述】:

我的 java 代码运行一个抛出退出代码的 main 方法。

如何捕获退出代码而不停止运行时?

        ConfigValidator.main(new String[] "-dirs", SdkServiceConfig.s.PROPERTIES_FILE_PATH);

我想用

        ProcessBuilder builder = new ProcessBuilder(commands);
        Process process = builder.start();
        int waitFor = process.waitFor();
        int a = process.exitCode()

但是我怎样才能运行它来运行 java 代码呢?

我无法更改“main”方法中的代码

【问题讨论】:

您提供的信息似乎不完整。您是否考虑将这些东西包装在 main() 中的 try catch 中? 找到这篇文章:***.com/questions/5549720/… 【参考方案1】:

java 代码不会抛出退出代码。

那是因为退出码是整数,不能抛出整数,只能抛出异常。

Java 代码exits 带有退出代码。

(我希望我可以说java代码返回退出代码,但不幸的是,java语言的设计者决定让main()函数返回void而不是退出代码,这让事情变得有点困难。)

以下 *** 答案建议使用防止调用 System.exit() 的安全管理器。因此,尝试调用System.exit() 将导致SecurityException,然后您可以从调用main() 函数的位置捕获该异常。

堆栈溢出:Java: How to test methods that call System.exit()?

当然,做事的正确方法是重组main(),使其不会调用System.exit(),这样您就不必做这样的骇人听闻的事情了。

【讨论】:

感谢您的链接。但是如何从非 JUNIT 代码中使用它? 该答案由两部分组成,一个是我上面提到的,另一个是特定于junit的。您可以忽略特定于 junit 的第二部分。此外,junit 并没有什么神奇之处:如果您需要在非测试代码中使用它,您可以。而且,如果您正在执行诸如从生产代码中调用 main() 之类的非常骇人听闻的事情,那么包含 junit 应该是您遇到的最少问题。 我使用了 java securityManager,但是每当我尝试打开任何文件时都会被拒绝访问权限 对不起,我不知道该说什么。我之前没有故意启用安全管理器的经验。如果我的回答对您没有帮助,请不要“接受”它。其他人可能会发布一个可能更有用的答案。【参考方案2】:

请尝试使用 Thread.sleep() 方法来避免程序退出,但我不确定它是否适合您。可能您需要通过系统输入或其他方式中断应用程序的执行。像这样。

【讨论】:

以上是关于java如何从java内部捕获退出代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个进程捕获退出代码[重复]

从命名管道捕获非零退出代码

如何从 C# 中的 powershell 脚本中捕获退出代码

java异常

任何人都知道如何克服 IntelliJ 中的“编译器内部错误。进程以退出代码 138 终止”?

如何从 Java 中运行的进程中获取 bash 命令退出代码?