当前位置: 首页 > 面试题库 >

有什么方法可以避免执行finally子句?

孙言
2023-03-14
问题内容

我了解到try catch语句的finally子句始终执行。但是有人对我说,有可能避免执行它(删除它不是一种选择)。

-有人怎么可能?

-我也很好奇知道为什么有人要避免执行它?


问题答案:

使用该finally块中未捕获的异常将其杀死,或者将整个JVM杀死(这将杀死线程)。

finally除了不良的设计外,没有充分的理由停止执行块。如果不应该每次都运行它,则不要将其放在一个finally块中。

使用下面的测试代码,我运行了两种不同的情况,以了解杀死时会发生什么Thread

  1. 启动Threadsleep主线程2秒钟。在内Thread,几乎立即进入该finally块,然后睡眠5秒钟。一旦主线程完成等待,终止Thread使用stop
  2. 启动Thread并睡眠2秒钟。内Thread,睡眠5秒进入前finally块,然后睡一些内finally给它被杀死的机会。

在第一种情况下,结果是该finally块停止执行。在第二种情况下,其结果是,该finally块完全执行,并且在Thread这是stopPED不会少。

输出(注意为所有输出添加的当前线程的名称):

thread-starting [main]
trying [Thread-0]
catching [Thread-0]
finally-sleeping [Thread-0]
thread-stopped [main]
 [main]
thread-starting [main]
trying-sleeping [Thread-1]
thread-stopped [main]
finally-sleeping [Thread-1]
finally-done [Thread-1]

码:

public class Main
{
    public static void main(String[] args)
    {
        testThread(new TestRunnable());
        println("");
        testThread(new TestRunnable2());
    }

    private static void testThread(Runnable runnable)
    {
        Thread testFinally = new Thread(runnable);

        println("thread-starting");

        testFinally.start();

        try
        {
            Thread.sleep(2000);
        }
        catch (InterruptedException e)
        {
            println("main-interrupted...");
        }

        testFinally.stop();

        println("thread-stopped");
    }

    private static class TestRunnable implements Runnable
    {
        @Override
        public void run()
        {
            try
            {
                println("trying");
                throw new IllegalStateException("catching");
            }
            catch (RuntimeException e)
            {
                println(e.getMessage());
            }
            finally
            {
                println("finally-sleeping");

                try
                {
                    Thread.sleep(5000);
                }
                catch (InterruptedException e)
                {
                    println("finally-interrupted");
                }

                println("finally-done");
            }
        }
    }

    private static class TestRunnable2 implements Runnable
    {
        @Override
        public void run()
        {
            try
            {
                println("trying-sleeping");

                Thread.sleep(5000);
            }
            catch (InterruptedException e)
            {
                println("trying-interrupted");
            }
            finally
            {
                println("finally-sleeping");
                try
                {
                    Thread.sleep(5000);
                }
                catch (InterruptedException e)
                {
                    println("finally-interrupted");
                }
                println("finally-done");
            }
        }
    }

    private static void println(String line)
    {
        System.out.printf("%s [%s]%n", line, Thread.currentThread().getName());
        System.out.flush();
    }
}


 类似资料:
  • 在传递给的方法的lambda中,我验证是否使用预期值调用了方法: 由于方法抛出一个,我被迫在lambda内部的调用周围添加一个无用的try/catch块。这是不必要的冗长。 我怎么能避免呢?

  • 本文向大家介绍Shell脚本避免重复执行的方法,包括了Shell脚本避免重复执行的方法的使用技巧和注意事项,需要的朋友参考一下 很多用cron定时执行的shell脚本可能会由于各种原因执行很久,会有必要在运行的时候先检查一下自身是否还在运行。本文提供的linux shell脚本用以检查以命令sh ...来执行的shell脚本。要对其他东西进行唯一性检查,可以稍微修改一下源代码。

  • 问题内容: 我希望能够以这种方式一个接一个地获取句子的POS标签: 但是问题是每个句子大约需要一秒钟。还有另一种选择可用于批量执行此操作并加快处理速度。但是,如果我能逐句地做这件事,我的生活会更轻松。 有没有办法更快地做到这一点? 问题答案: 对于NLTK 3.1版,里面,是这样定义的: 因此,每次对first的调用实例化都会花费一些时间,因为它涉及加载pickle文件。 只需调用when是。因此

  • 材料设计非常强调“纸张”的隐喻。要做到这一点,阴影是必不可少的。由于材料设计是一种理念,而不是API(尽管它内置在L中),因此应该在任何地方(Windows窗体、HTML/CSS等)进行设计。如何在Android API 14到20中做到这一点? 请注意,对于圆形和其他非方形形状,预制PNG实际上并不实用。

  • 问题内容: 这是我要执行的一些代码。我想等待AJAX​​响应,以便可以从服务器返回一些信息。有什么办法可以做到这一点? 问题答案: 很高兴在这里读到。 这实际上不是“同步的”,但我认为它可以达到OP的预期。 旧的(自此之后,jQuery的选项已被弃用): 所有Ajax调用都可以异步(使用回调函数,这是在“成功”键之后指定的函数)或同步完成-有效地阻止并等待服务器应答。要获得同步执行,您必须指定 就

  • 我正在处理一个大型医学数据集,我想看看是否有一些行对应于同一个患者。与患者 ID 对应的列是 。 我想创建一个新列,如果该患者出现在多行中,它将是“是”,如果它只出现一次,它将 这是我做的代码: 但是这个操作太花时间了。有什么方法可以做得更快吗?