【问题标题】:How does one catch an exception thrown by the main method in java?如何捕获java中main方法抛出的异常?
【发布时间】:2017-03-26 16:03:09
【问题描述】:
public static void main(String[] args) throws IllegalArgumentException {
  if (args[0].matches(".*\\w.*")) {
    throw new IllegalArgumentException("Can't input characters!");
  }
  String input = insertSpaces(args[0]);
  args = input.split("\\s+");
  printAnswer(calculate(args),args);
} 

在上面的代码中,main 方法抛出了一个 IllegalArgumentException。如何捕获 main 方法抛出的异常?我问的原因,如果我不正确请纠正我,因为我的理解是,当一个方法抛出异常时,方法的调用者负责捕获异常。在这种情况下,主要方法没有其他方法调用它,所以我不知道如何捕获异常。我猜 JVM 正在幕后工作以调用该方法,但是我将如何让 JVM 捕获执行。如果可能,请提供代码以及解释。否则解释为什么不可能。

【问题讨论】:

  • 你不会从 main 方法中抛出异常。您要么从 main 处理它,要么直接退出程序。
  • 如果main 抛出异常,JVM 默认捕获它,打印堆栈跟踪,然后关闭。
  • 让我看看我是否明白。由于无效的输入最终会关闭我的程序,所以从我的 main 方法中抛出异常只是一种使其提前终止的方法,因为我无法手动捕获它?
  • 为什么不在包含您的代码的主方法中添加一个 try-catch 块?这就是您想要的 - 只需自己捕获并处理它(正如@JoeC 精美指出的那样,一旦您的 main 方法抛出异常,JVM 就会关闭 - 所以最好抓住它!)
  • @Japu_D_Cret 我明白了,我将研究解决我的问题的解决方案并将其发布。

标签: java exception-handling


【解决方案1】:

最佳实践是在 main 方法调用时避免它们并处理它并向用户显示有关发生的事情的有意义的消息并决定继续或终止。 正如 Joe C 提到的,您可以让它抛出,以便 JVM 进行处理,并且用户或调用者将看到堆栈跟踪。当您做出这样的决定(在 main 上使用 throws)时,您对异常无能为力。即您收到所需的文件名作为 arg 但文件不存在。如果你不记录到外部资源,可能你想让 JVM 打印堆栈跟踪

【讨论】:

    【解决方案2】:

    永远不要从main 方法中抛出异常。

    永远不要让main 方法因异常而崩溃。

    IllegalArgumentException 与任何运行时异常一样,是程序员搞砸的结果。修复你搞砸的地方。

    不要抓住它,阻止它。

    【讨论】:

    • 在这种情况下我必须不同意。你说 IllegalArgumentException 是程序员的结果。在这种情况下,不是程序员的用户正在为程序输入值。程序员的工作是通过指导用户如何正确使用程序来确保程序正常工作,即使用户搞砸了而不是程序突然结束。程序员因此使程序具有适应性和灵活性。
    • 在这种情况下,OP 不正确地使用异常,因为它不代表程序员的混乱。以什么方式从main 抛出运行时异常“指导用户如何正确使用程序,即使用户搞砸了而不是程序突然结束”?
    猜你喜欢
    • 2011-02-12
    • 2011-12-05
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2012-12-02
    相关资源
    最近更新 更多