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

时间:2010-03-09 06:13:16

标签: java exception exception-handling

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

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

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

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

3 个答案:

答案 0 :(得分:5)

此处给出了完整未捕获异常处理的详细流程图:How uncaught exceptions are handled in 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...");
    }
}

输出:

Caught: java.lang.Exception: Hi there!
Exiting...

答案 1 :(得分:1)

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

它将出现在生产代码中,但是当快速原型设计或敲除测试代码时,它经常被用作比输入try {...} catch块更快的代码。 (除非你使用像Eclipse 3.5这样的好的IDE,它具有'自动包装在try / catch'功能[自动检测任何和所有例外!] ;-))

或者你很确定它不会被main()调用的方法抛出。

但是,如果只是使用e.printStackTrace()......,即使包装在try / catch块中也会产生相同的输出,就好像你没有留下Exception一样...

答案 2 :(得分:0)

在命令行。

编辑:入口点为Main。因此,没有其他方法/调用者来处理异常。

相关问题