当前位置: 首页 > 知识库问答 >
问题:

为什么我不能使用“outer”catch捕获在嵌套catch子句中引发的异常?

拓拔谭三
2023-03-14

在下面的示例中,您可以看到无法使用外部catch子句捕获IOException(命名为第四个)异常。这是为什么?我知道,如果在嵌套的try块中抛出异常,使用外部catch可以捕获异常。如果您将b静态变量值更改为false,那么您可以看到这一点。

但是为什么我们不能使用外部catch捕获在嵌套catch子句中抛出的异常呢?

import java.io.*;

public class Exceptions {

    static boolean b = true;

    public static void main(String[] args){
        try {
            exceptions(b);
        } catch (Exception e) {
            System.out.println(e  + " is handled by main().");
        }       
    }

    static void exceptions(boolean b) throws Exception{
        try{
            if(b) throw new FileNotFoundException("FIRST");
            try{
                throw new IOException("SECOND");
            }
            catch(FileNotFoundException e){
                System.out.println("This will never been printed out.");
            }
        }
        catch(FileNotFoundException e){
            System.out.println(e + " is handled by exceptions().");
            try{
                throw new FileNotFoundException("THIRD");        
            }
            catch(FileNotFoundException fe){            
                System.out.println(fe + " is handled by exceptions() - nested.");
            }
            try{
                throw new IOException("FOURTH");
            }
            finally{}
        }
        catch(Exception e){
            System.out.println(e + " is handled by exceptions().");
        }
    }
}

如果b=真,则输出:

fileNotFoundException:FIRST由exceptions()处理。fileNotFoundException:第三个由exceptions()处理-嵌套。IOException:第四个由main()处理。

b=false时的输出:

IOException:第二个由exceptions()处理。

共有1个答案

卫俊誉
2023-03-14

但是为什么我们不能使用外部catch捕获在嵌套catch子句中抛出的异常呢?

你可以的。问题是,上一个catch(Exception e)处于相同的嵌套级别,这就是为什么它不能捕获前一个catch块中抛出的异常。

尝试像这样嵌套Try/catch块

static void exceptions(boolean b) {
    try {
        try {
            if (b) throw new FileNotFoundException("FIRST");
            try {
                throw new IOException("SECOND");
            } catch (FileNotFoundException e) {
                System.out.println("This will never been printed out.");
            }
        } catch (FileNotFoundException e) {
            System.out.println(e + " is handled by exceptions().");
            try {
                throw new FileNotFoundException("THIRD");
            } catch (FileNotFoundException fe) {
                System.out.println(fe + " is handled by exceptions() - nested.");
            }
            // will be caught by the nested try/catch at the end.
            throw new IOException("FOURTH");
        }
    } catch (Exception e) {
        System.out.println(e + " is handled by exceptions().");
    }
}
 类似资料:
  • 请求(正文)

  • 问题内容: 在大学里有关Java的问题中,有以下代码片段: 我被要求提供其输出。我回答了,但是正确答案是。为什么会这样呢?我只是不明白MyExc2去哪了。 问题答案: 通过阅读你的答案并了解你可能的想法,我相信你认为“进行中的例外”具有“优先权”。记住: 当一个新的异常被抛出到一个catch块或将要传播到该块之外的finally块中时,当新的异常向外传播时,当前异常将被中止(并被遗忘)。与其他任何

  • 我真的不明白使用嵌套的try-catch块的意义。它们很难阅读,有时也不太直白。例如: 上面的代码可读性更强,我可以理解它的功能——如果发生异常,可以由其中一个catch块处理。但如果我使用嵌套表单: 上面的代码乱七八糟!但它实现了与第一个代码完全相同的功能。还是没有?帮我弄清楚:(

  • 问题内容: 在Java中,我想做这样的事情: …代替: 有什么办法吗? 问题答案: 从Java 7开始,这已经成为可能。多捕获块的语法为: 但是请记住,如果所有异常都属于同一类层次结构,则可以简单地捕获该基本异常类型。 还要注意,如果从ExceptionA直接或间接继承了ExceptionB,则不能在同一块中同时捕获ExceptionA和ExceptionB。编译器会抱怨:

  • 大家好!我只是一个学生和完全初学者学习Java。我遇到过这样的问题:“可以被替换为multi-catch或几个catch子句来捕获特定的异常”,在部分catch(Exception ex)的图像中,它有黄色的下划线颜色,这给了我一个错误。我想插入数据到我的数据库,但它没有插入,因为这个错误。正如您在我的代码中所看到的,我已经尝试打印数据,并且都很成功。能不能请谁来开导一下,帮帮我,我到底做错了什么

  • 我有一个测试网站功能的Node.js项目。它利用Webdriver.iov4和摩卡/柴。 我创建了一个函数,用于检查页面上是否存在超时1分钟的元素。如果元素存在,它应该返回。如果没有,它应该返回。 我使用相同的函数来测试页面上是否没有元素。在这种情况下,我希望函数返回。但是,函数不会返回false,而是抛出超时错误,并且既不返回也不返回。这很奇怪,因为我在try-catch子句的catch块中包含