javaexception会终止整个java应用程序吗?

我曾经认为,当发生exception时,整个java应用程序将被终止。 例如,我编写了一个测试函数来测试我的想法。

public void test(){ File fileDir=new File(sourceDataDir); if(fileDir.exists()){ File[] files = fileDir.listFiles(); for(int index=0 ; index<files.length ; index++){ System.out.println("index = "+index); File file = files[index]; if(index == 1)//delete a file to cause a FileNotFoundException file.delete(); try { BufferedReader in = new BufferedReader(new FileReader(file)); } catch (FileNotFoundException e) { e.printStackTrace(); } } } } 

我删除文件以手动导致FileNotFoundException 。 我以前认为整个应用程序将在exception发生时终止。 但实际上,应用程序将继续读取剩余的文件。 所以,我的问题是,在什么情况下exception将导致整个应用程序被终止?

我的问题是,在什么条件下,exception会导致整个申请被终止?

它永远不会。 只有System.exit()导致整个程序终止(和JVM崩溃)

想想一个例外,就像一个强大的break; 这可以打破方法。 中断可能导致循环退出,如果唯一的非守护程序线程中的最后一个循环,程序将退出。 但它并不会导致它,即使它可能是你在编程之前看到的最后一件事。

如果未捕获exception,则将终止发生exception的线程。 如果没有非守护程序线程,则JVM将终止。 这是exception终止JVM的唯一方法。 如果捕获exception,它将永远不会导致JVM终止。

有两种主要类型的例外:

  • 不是运行时exception

它表示系统正常运行。 您必须捕获exception,否则将无法编译。 它永远不会终止申请。 如果要终止,则必须在catch块中调用System.exit(ERROR_NUMBER)或抛出运行时exception。

  • 运行时exception

表示系统错误(例如,应用程序服务器配置错误)。 你不必抓住它。 如果您没有捕获它,它会终止应用程序,或者如果您编写J2EE应用程序,AS可能会处理它并继续您的应用程序。

所以,我的问题是,在什么条件下,exception将导致整个应用程序被终止?

有关例外的详细信息,请参阅文档 。 至于你的问题FileNotFoundException是一个已检查的exception,这意味着你需要处理它。 现在你必须选择

  1. 捕获FileNotFoundException并处理(您可以简单地打印堆栈跟踪并继续)
  2. 或者你可以将它扔给父(调用方法)

在第1种情况下,您的java进程将一直持续到结束(假设没有运行时exception/错误)。

在案例2中,如果你甚至在父(调用函数)中没有捕获到FileNotFoundException并且再次抛出它并继续这样做,则exception将最终在main()方法中出现。 即使你的main()方法抛出此exception,JVM也会关闭。

更新以澄清您的意见:

捕获exception与是否捕获Excpetion无关。 包含未更新的exception,您仍然可以捕获它并让程序继续运行。 但是不建议这样做,因为通过定义未缓存的exception(根本不应该发生),如果发生未缓存的exception,则不应该恢复。

考虑以下简单示例

 public static void main(String args[]) { try { String s = null; System.out.println(s.length()); } catch (Exception e) { System.out.println("Catch runtime exception but not quite sure what to do with it"); } System.out.println("Reached here even after uncatched Exception"); } 

输出是

 Catch runtime exception but not quite sure what to do with it Reached here even after uncatched Exception 

所以基本上每当发生Exception时如果你没有从原点捕获它,它最终会传播到main(),JVM最终会关闭。 如果你确实捕获它(无论catched或uncatchedexception),你的程序将继续(在未捕获exception的情况下输出可能不是预期的)并终止。

否.java的Exception handlers的exception执行