java异常是否会终止整个java应用程序?

java异常是否会终止整个java应用程序?,java,multithreading,exception,exception-handling,jvm,Java,Multithreading,Exception,Exception Handling,Jvm,我曾经认为,当异常发生时,整个java应用程序都将终止。例如,我编写了一个测试函数来测试我的想法 public void test(){ File fileDir=new File(sourceDataDir); if(fileDir.exists()){ File[] files = fileDir.listFiles(); for(int index=0 ; index<files.length ; index++){

我曾经认为,当异常发生时,整个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();
            }
        }
    }
}
公共无效测试(){
File fileDir=新文件(sourceDataDir);
if(fileDir.exists()){
File[]files=fileDir.listFiles();
对于(int index=0;index
我的问题是,在什么情况下,异常会导致整个应用程序终止

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


想象一个异常,就像一个强大的
中断;
,它可以中断方法。中断可能会导致循环退出,如果只有非守护进程线程中的最后一个循环退出,程序将退出。但它不会导致异常,即使它可能是您在程序死亡之前看到的最后一件事。

否。
异常处理程序
java处理程序的异常执行有两种主要类型的异常:

  • 非运行时异常
它表示系统工作正常。您必须捕获异常,否则它将无法编译。它永远不会终止应用程序。如果仍要终止,则必须调用catch块中的system.exit(错误号)或引发运行时异常

  • 运行时异常
表示系统错误(例如,应用程序服务器配置错误)。您不必捕获它。如果未捕获它,它将终止应用程序,或者如果您编写J2EE应用程序,它可能会处理它并继续您的应用程序

所以,我的问题是,在什么情况下,异常会导致 整个申请将被终止

有关异常的详细信息,请参阅。对于您的问题,FileNotFoundException是一个选中的异常,这意味着您需要处理它。现在您必须选择其他选项

  • 捕获FileNotFoundException和句柄(只需打印堆栈跟踪并继续)
  • 或者您可以将其扔给父对象(调用方法)
  • 在案例1中,您的java进程将一直持续到结束(假设没有发生运行时异常/错误)

    在案例2中,如果您甚至在父级(调用函数)中也没有捕获FileNotFoundException并再次抛出并继续这样做,则异常最终会在main()方法中出现。如果您的main()方法也抛出此异常,JVM将简单地关闭

    澄清您评论的更新:

    捕获异常与是否捕获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
    

    因此,基本上每当异常发生时,如果您没有从原点捕获到它,它将最终传播到main(),JVM将最终关闭。如果您捕获到它(无论捕获或未捕获异常),您的程序将继续(在未捕获异常的情况下,输出可能与预期不符)和终止。

    如果未通过捕获捕获异常,则发生异常的线程将被终止。如果没有非守护进程线程,JVM将终止。这是异常终止JVM的唯一方式。如果捕获异常,它将永远不会导致JVM终止。

    Peter您能告诉我吗检查我提供的答案。我得到了否决票,我不知道为什么。好的,非常感谢你花时间在这上面。我会考虑这一点。答案也是+1。我想我是在尝试提出同样的建议。所以,只有未经检查的异常可能导致主函数终止,对吗?如果是未经检查的异常,是否捕获它取决于我因此,JVM不会强迫我们显式地捕获或抛出此异常,对吗?未经检查的异常通常是编程错误,如果实现正确,这些错误根本不会发生(索引越界、空指针、类强制转换等)因此,调用方/用户通常不能对它们做任何事情。即使异常被检查一次,我们只是简单地将它抛出每个方法,它最终将传播到主方法,JVM将关闭。“因此,只有未检查的异常可能导致主函数终止,对吗?”未修补的异常将导致线程终止。虽然在编译器强制捕获已修补的异常时,乍一看除了RuntimeException或Error之外的异常不可能保持未修补状态,但有几种方法可以生成它们。例如,不推荐使用的方法
    thread.stop(Throwable)
    允许抛出任意未声明的一次性事件。您还可以在编译调用方后更改一个方法来声明已检查的异常。还有其他一些特殊情况。实际上,我刚刚测试了它,RuntimeException没有终止。相反,它会将异常冒泡到更高级别的调用方(只要您没有在捕获中吞下它)我认为如果没有更高级别的调用程序捕获它,进程将终止(例如NullPointerException)。应用程序服务器吞下这些错误,这样企业应用程序错误就不会使整个JavaEE服务器崩溃。@Gadam您是如何测试它的?独立Java进程还是应用程序容器(例如Tomcat)?