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

最后尝试catch和其余方法的执行顺序

漆雕兴平
2023-03-14

我对使用try/catch/finally子句有疑问,让我解释一下:我知道每个在其声明中声明异常规范的方法都必须(在调用方法中)被一个try块包围,然后是一个可以捕获该异常的catch块(除非我没有声明调用方法也抛出异常)。如果调用方法在try-catch之后有其他语句,则无论发生什么情况(是否引发异常),都会执行这些语句。如果我有以下代码:

 public class ExceptionCall {
   Throwing t = new Throwing();
    public void methodTry(){
        while(true){
            try {
                if (t.flag++==0)
                    t.throwing();
                System.out.println("no exception");
            } 
            catch (MyException e) {
                e.printStackTrace(System.err);
                System.out.println("working on it!");
            }
            finally{
                System.out.println("finally clause");
            }
                System.out.println("out");
                if (t.flag==2) 
                    break;  
        }
    }
}

这里有一个名为(猜猜看:)Throwing()的方法,该方法被声明为抛出一个MyException异常,并有一个名为flag的公共字段,其中包含一个初始化为0的int,以提供一种条件检查。

因此,无论try块中发生了什么,都会有几次执行受保护区域之外的代码。

所以我的问题是,最后的障碍是什么??我的意思是,我知道当调用方法从try或catch块返回时,它很有用(在这种情况下,我可以在catch中有一个break语句,finally将被执行),但是在这样的情况下,有什么区别呢??

共有2个答案

单于耘豪
2023-03-14

最后,块用于处理那些需要您在语句末尾进行一些操作的资源,无论代码中发生什么。

例如:读卡器或流是使用后必须关闭的资源,但在使用过程中可能会发生异常,所以在哪里关闭它们???

这里是最后一个子句变得非常方便的地方:

FileReader reader;

try {
  reader = new FileReader("someNonExistingFile");
} catch (FileNotFoundException e) {
   // handle FileNotFoundException
   e.printMessage();
} finally {
   // reader MUST BE CLOSED ALWAYS, so FINALLY, CLOSE IT
   reader.close();
}

在此示例中,您需要始终关闭阅读器(如果文件存在,如果文件不存在),因此,您使用而不是关闭它两次(在trycatch中)最后

最后在这里提供更多信息和示例。还要检查try with resources(Java 7)。

诸葛阳成
2023-03-14

finally块总是在try块退出时执行。这确保即使发生意外异常,也会执行finally块。但最后,它不仅仅适用于异常处理,它允许程序员避免清理代码被返回、继续或中断意外绕过。将清理代码放在finally块中始终是一种好做法,即使在没有预期异常的情况下也是如此。

请参阅:https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

 类似资料:
  • 问题内容: 当try块中存在时,我对try- finally执行感到困惑。据我了解,finally块将始终执行,即在返回调用方法之前。在考虑以下简单代码时: 实际打印的结果为1。这是否意味着不执行finally块?有人可以帮我吗? 问题答案: 从块返回时,返回值存储在该方法的堆栈帧中。之后,将执行finally块。 更改finally块中的值不会更改堆栈中已存在的值。但是,如果您从finally块

  • 问题内容: 在此Java代码中, 我期望的输出是 但是有时候我得到这个预期的输出,而在其他时候我得到以下输出: 有时甚至是这个输出: 以及我是否获得第一,第二或第三输出似乎在每次执行期间都是随机发生的。我发现此POST显然在谈论相同的问题,但我仍然不明白为什么有时会得到输出1、2或3。如果我正确理解了这段代码,那么输出1应该是我每次得到的(发生异常) )。如何确保始终如一地获得输出1,或者能够确定

  • 问题内容: 我试图在Java中实现一个非常简单的Trie,该Trie支持3种操作。我希望它具有一个insert方法,一个has方法(即trie中的某个单词)和一个toString方法以字符串形式返回trie。我相信我的插入工作正常,但是has和toString证明很困难。到目前为止,这就是我所拥有的。 特里类。 和节点类 因此,基本上,在创建Trie时,将创建一个TrieNode作为具有26个子级

  • 问题内容: 在下面的代码中,我试图一次性进行多个(大约10个)HTTP请求和RSS解析。 我在需要访问和解析结果的URI数组上使用标准构造。 码: 我了解一次调用函数时,应该使用回调。但是,在此示例中,我唯一想到使用回调的方法是调用一个函数,该函数对被调用的次数进行计数,并且仅在被调用的次数与看起来很hacky 的次数相同时才继续。 所以我的问题是, 在node.js中处理这种情况的最佳方法 是

  • 该程序的输出: 是: 为什么当 开始时 不是 1?

  • 我正在尝试使用testng.xml执行testcases。我已经将所有的测试运行类放在一个测试中。在执行时,我注意到第二类(仪表板类)的@beforeTest方法首先执行。我希望执行所有类的@beforeTest方法,以与testng.xml文件中的类相同的执行顺序执行。请看下面的图片。 对于我在提到的类中使用的所有@beforeTest和@beforeClass我都使用了waysrun=true