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

尝试,捕获和最终执行的确切顺序是什么?

越景天
2023-03-14
问题内容

在此Java代码中,

import java.io.IOException;

public class Copy
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("usage: java Copy srcFile dstFile");
         return;
      }

      int fileHandleSrc = 0;
      int fileHandleDst = 1;
      try
      {
         fileHandleSrc = open(args[0]);
         fileHandleDst = create(args[1]);
         copy(fileHandleSrc, fileHandleDst);
      }
      catch (IOException ioe)
      {
         System.err.println("I/O error: " + ioe.getMessage());
         return;
      }
      finally
      {
         close(fileHandleSrc);
         close(fileHandleDst);
      }
   }

   static int open(String filename)
   {
      return 1; // Assume that filename is mapped to integer.
   }

   static int create(String filename)
   {
      return 2; // Assume that filename is mapped to integer.
   }

   static void close(int fileHandle)
   {
      System.out.println("closing file: " + fileHandle);
   }

   static void copy(int fileHandleSrc, int fileHandleDst) throws IOException
   {
      System.out.println("copying file " + fileHandleSrc + " to file " +
                         fileHandleDst);
      if (Math.random() < 0.5)
         throw new IOException("unable to copy file");

      System.out.println("After exception");
   }
}

我期望的输出是

copying file 1 to file 2
I/O error: unable to copy file
closing file: 1
closing file: 2

但是有时候我得到这个预期的输出,而在其他时候我得到以下输出:

copying file 1 to file 2
closing file: 1
closing file: 2
I/O error: unable to copy file

有时甚至是这个输出:

I/O error: unable to copy file
copying file 1 to file 2
closing file: 1
closing file: 2

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


问题答案:

问题是,您正在向中写入一些输出,System.out并向中写入一些输出System.err。这些是具有独立缓冲的独立流。据我所知,何时刷新它们的时间尚未指定。

简而言之,当写入不同的流时,您不能使用输出显示的顺序来确定调用println()发生的顺序。请注意,输出to
System.out始终按预期顺序显示。

根据执行顺序,首先执行的主体try。如果抛出异常,catch则执行适当子句的主体。该finally块总是最后执行。



 类似资料:
  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 问题内容: 我有一个需要类似以下内容的场景 在我的尝试,我会,数据,将其与基于处理其他数据集。 在随后。有可能阻止吗?下面是伪代码: 问题答案: 无需创建表,您只需声明一个表变量(查询结束时该变量将自动消失)。

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

  • 我想运行几行代码,但我不确定是否有任何行会抛出错误。但是如果发生错误,我希望脚本忽略该行并继续。 一种选择是使用<code>try-catch-end TL;TR:除了为下面示例代码中的每一行编写<code>try-catch-end 示例代码: 输出: 首选输出: 相关:为什么我不应该在“try”-“catch”中包装每个块?

  • 在 中,尝试捕获最终阻止的工作原理是什么? 所以如果有例外,我知道它会跳到捕获块,然后跳到最后的块。 但是如果没有错误,catch块不会运行,但是finally块会运行吗?

  • 问题内容: 我有一个DAO类,其中包含许多方法,这些方法具有以下重复代码:- 我想重组该类,以便将尝试,捕获和最终放置在一个地方以避免重复。我将如何完成? 问题答案: 为ex创建一个接口。可执行文件: 将每个dao方法重构为: 创建以下方法在您的DAO中执行: