【问题标题】:Throws for main function doesn't catch error [duplicate]抛出主函数不会捕获错误[重复]
【发布时间】:2020-08-02 20:01:30
【问题描述】:

我无法理解 Thread.sleep() 的 InterruptedException 错误被 JVM 捕获的原因,而 ThreadExecp.fun() 则并非如此。

public class ThreadExecp {
static void fun() throws InterruptedException
{
    System.out.println("Inside fun(). ");
    throw new InterruptedException ();
}

public static void main(String args[]) throws InterruptedException {

    Thread.sleep(10000);
    System.out.println("done 1");
    ThreadExecp.fun();
    System.out.println("Done");

}
}

在 main 方法中实际发生的错误在哪里被捕获,为什么有些可以简单地抛出而有些需要在 try-catch 中捕获?

【问题讨论】:

  • 如果您的方法声明它throws 它,则可以抛出任何异常。通常,从main 中抛出的那些会杀死你的程序。
  • 异常通常是由于可能使您的代码处于不一致状态的结果。因此,如果程序员不通过 throw/catch 处理它们,那么最好在程序损坏您的文件之前以崩溃结束。

标签: java error-handling


【解决方案1】:

InterruptedException 在这里的任何地方都没有被捕获,它只是沿着调用堆栈传播。而且你的代码中没有任何东西可以捕捉和处理它,JVM别无选择,只能处理未处理的异常。

【讨论】:

    【解决方案2】:

    主函数的抛出没有捕获错误

    没有“抛出”或“抛出”捕获异常/错误。只有 'catch' 捕获异常/错误。

    方法声明中的“抛出”子句的意义在于说明该方法可能会抛出所述异常。

    然后,此类方法的调用者对其编码有两种选择:(1) 捕获所述异常,或 (2) 通过“抛出”声明它可以传递该异常。

    等等,备份调用链。

    降压必须停止“主要”。 'main' 要么有一个异常处理程序(try-catch 语句),要么将它传递('throw')给它的调用者,松散地说就是 JVM 本身。

    在您的情况下,您的“主要”可能会看到 InterruptedException 有两个不同的原因 - 调用 fun() 和调用 sleep()。这两个都被声明为可能引发该异常。

    你的问题陈述有点混乱。我认为您可能误解了异常在调用堆栈中传播的方式,直到找到处理程序为止。在您的示例 main 中,根本没有处理程序。

    就我个人而言,我认为在 main 上放置“throws”是一种糟糕的风格。这意味着您的程序知道某个异常是可能的,并将把它留给 JVM 来处理它。您应该编写一个异常处理程序,明确地执行您认为合适的任何事情。在您的示例情况下,异常处理程序可能只是打印“中断”,例如 - 这似乎适合其余代码。

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2021-10-14
      • 2012-10-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多