在我读过的一些代码中,我遇到过这个问题:
class Someclass
{
public static void main(String[] args) throws IOException
{
//all other code here......
}
}
如果main()抛出异常,在这种情况下是一个IOException,它在哪里被捕获和处理?
编辑: 这被认为是不好的做法吗?或者这在现实代码中是否真的很常见?
答案 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
。因此,没有其他方法/调用者来处理异常。