捕获和处理此异常在哪里?

Zak*_*aki 1 java exception-handling exception

在我读过的一些代码中,我遇到过这个问题:

    class Someclass
    {
      public static void main(String[] args) throws IOException
      {
        //all other code here......
      }
    }
Run Code Online (Sandbox Code Playgroud)

如果main()抛出异常,在这种情况下是一个IOException,它在哪里被捕获和处理?

编辑:这被认为是不好的做法?或者这在现实世界的代码中真的很常见吗?

pol*_*nts 5

此处给出了完整未捕获异常处理的详细流程图:Java中如何处理未捕获的异常.

发生未捕获的异常时,JVM执行以下操作:

  • 它在发生异常dispatchUncaughtException()Thread类上调用一个特殊的私有方法;
    • [...]调用线程的getUncaughtExceptionHandler()方法来找出要使用的适当的未捕获异常处理程序.通常,这实际上是线程的父级ThreadGroup,handleException()默认情况下其方法将打印堆栈跟踪.
  • 然后它终止发生异常的线程.

因此,如果您愿意,您可以创建自己的自定义未捕获异常处理程序.

还应当指出的是,虽然main是常用的Java应用程序的入口点,方法是一样的,因为它的任何其他的方法可以也可以从其他上下文调用(例如:其他main方法,甚至本身递归!).在这种情况下,调用者可以捕获抛出的异常.

public class SelfCatch {
    public static void main(String args[]) throws Exception {
        if (args == null) throw new Exception("Hi there!");
        try {
            main(null);
        } catch (Exception e) {
            System.out.println("Caught: " + e);
        }
        System.out.println("Exiting...");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Caught: java.lang.Exception: Hi there!
Exiting...
Run Code Online (Sandbox Code Playgroud)