有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java系统。退出(num)或从main引发RuntimeException?

我有一个单线程应用程序,如果出现问题,应该将DOS errorlevel设置为非零。抛出RuntimeException还是使用System更好。退出(非零)?我不需要堆栈跟踪,也不希望这个应用程序被扩展/重用。这两个选项之间有什么区别


共 (6) 个答案

  1. # 1 楼答案

    通常在这种情况下,我会在我的main方法中处理所有异常,可能是通过调用System.exit。这为您提供了在何处/是否/如何处理异常情况的灵活性,同时仍然满足了以错误代码终止的需求。特别是,它使您可以控制返回代码和可能为用户生成的任何其他输出(错误消息、堆栈跟踪等)。如果您在main中抛出异常(或让异常转义),您将失去该控制

    总之,仅在顶级异常处理程序中调用System.exit

    static public void main() {
       try {
          runMyApp();
       } catch (Exception e) {
          System.exit(1);
       }
    }
    
  2. # 2 楼答案

    这取决于要向启动程序的脚本报告多少信息。如果脚本设计为执行一系列操作,那么这一点非常重要https://shapeshed.com/unix-exit-codes/

    示例:我开发了一个Java程序,可以调用外部API,下载响应并将其保存到文件中。 可能的结果:

    • 0=正常
    • 5=HTTP暂时不可用
    • 6=无法将文件写入磁盘

    现在我的脚本知道出了什么问题,它可以根据结果采取不同的行动

    • 如果response=0,则继续脚本中的下一步
    • 如果响应=5,则重试(延迟)
    • 如果response=6,则停止脚本

    底线:像任何好的api一样,明确定义输入和输出参数并使用System.exit

  3. # 3 楼答案

    系统。exit(num)不是一个好选项,因为它关闭了JVM,而且如果有after catch块,它甚至没有运行finally块

    抛出RuntimeException也可能不是最好的选择,可以像前面提到的那样创建子类,在我看来,这是特定于应用程序的异常可能是更好的选择。 -曼尼什语

  4. # 4 楼答案

    抛出的异常将打印出堆栈跟踪,如果不需要,则应使用系统。退出

    退出后,您可以使用系统通知用户。out(我假设应用程序仅在commanline环境中运行)

    你应该考虑只需在一个单独的日志中记录所有错误,这就保证了在关闭终端时,STATCURTION不会永远丢失。为此,请看一下log4j,它非常易于使用

  5. # 5 楼答案

    除非您确实有异常情况,否则不要抛出异常System.exit(int)的存在正是因为这个原因。使用它

    编辑:我想我可能误解了你的问题。我以为您是在问,当您希望正常退出JVM,但表示某些事情不太正常时,抛出异常还是使用System.exit更好

    但是,如果发生的问题已经由Java异常指示,那么可以不处理该异常。您不必捕获异常并调用System.exit

    如果您可以选择是抛出自己的异常还是调用System.exit,请考虑错误条件是否可以由调用您的方法的Java代码处理。如果错误直接发生在main方法中,那么可能永远不会有调用方来处理异常,因此您可能应该调用System.exit。否则,通常最好抛出一个异常,而不是RuntimeException,您可能应该使用一个异常类型来适当地表示您遇到的错误。如果需要,编写自己的RuntimeException子类

  6. # 6 楼答案

    应用程序本身应该使用系统。出口它是它与调用环境(脚本)的接口。当然,任何内部组件都应该使用异常。当你把它放在一起时,它可以是两个:

    Application.main(...) {
      parse(args);
      check(...);
      try {
        MyObject o = ...;
        o.doMyStuff();
      } catch (Exception e) {
        System.err.println("Oops, something went wrong!"); // by example, or use a logging framework! // anyway in a shell app System.in/out/err IS my interface with the outworld
        System.exit(ERROR_CODE);
      }
      System.out.println("Worked!");
    }