try、catch 和finally 的确切执行顺序是什么?

2023-11-27

在这段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

无论我得到第一个、第二个还是第三个输出,似乎在每次执行过程中都是随机发生的。我发现这个帖子这显然讨论了同样的问题,但我仍然不明白为什么我有时会得到输出 1、2 或 3。如果我正确理解这段代码,那么输出 1 应该是我每次得到的(异常发生)。如何确保我始终如一地获得输出 1,或者能够判断何时获得输出 1 或者何时获得输出 1 得到输出 2 或 3?


问题是您正在将一些输出写入System.out和一些System.err。这些是独立的流,具有独立的缓冲。据我所知,没有具体说明何时冲洗它们。

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

就执行顺序而言,主体try首先执行。如果它抛出异常,则相应的主体catch然后执行子句。这finally块总是最后执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

try、catch 和finally 的确切执行顺序是什么? 的相关文章

  • jvm中本机代码如何转换为机器代码[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我读过一些文章说 jvm将字节码转换为机器码 jvm将字节码转换为本机代码 jvm 将字节码转换为系统调用 系统调用又由操作系统与硬件
  • 通过 html tidy 提供渲染 jsp 页面

    我有一个在 Glassfish 上运行的 Java 项目 它会呈现一些难看的 HTML 这是使用各种内部和外部 JSP 库的副作用 我想设置某种渲染后过滤器 通过 HTMLTidy 提供最终的 HTML 这样源代码就很好且整洁 有助于调试
  • Java中的文字赋值[重复]

    这个问题在这里已经有答案了 定义上有什么区别 double example 23 1d or double example 23 1 为什么long float double可以以l f d结尾 之间没有区别double example 2
  • 如何在Spring Boot中初始化一次MongoClient并使用它的方法?

    您好 我正在尝试导出MongoClient在 Spring Boot 中成功连接后 我尝试在其他文件中使用它 这样我就不必每次需要在 MongoDB 数据库中进行更改时都调用该连接 连接非常简单 但目标是将应用程序连接到我的数据库一次 然后
  • 使用正则表达式验证输入字符串是否为 0-255 之间的数字

    我在将输入字符串与正则表达式匹配时遇到问题 我想验证输入数字在 0 255 之间并且长度最多应为 3 个字符 代码工作正常 但当我输入 000000 至任意长度时 显示 true 而不是 false 这是我的代码 String IP 000
  • 我们可以在不使用 main 方法、静态变量和静态方法的情况下在控制台上打印 java 消息吗?

    public class Test param args 1st way public static void main String args TODO Auto generated method stub System out prin
  • ResultSet:通过索引检索列值与通过标签检索

    使用 JDBC 时 我经常遇到这样的结构 ResultSet rs ps executeQuery while rs next int id rs getInt 1 Some other actions 我问自己 以及代码作者 为什么不使用
  • Active MQ - HelloWorld 示例异常

    我正在尝试运行 hello world 示例在这里找到 http activemq apache org hello world html I added activemq all 5 5 1 jar已经到图书馆了 它构建成功 但出现以下警
  • 如何为java注释处理器编写自动化单元测试?

    我正在尝试使用 java 注释处理器 我可以使用 JavaCompiler 编写集成测试 事实上我现在正在使用 hickory 我可以运行编译过程并分析输出 问题 即使我的注释处理器中没有任何代码 单个测试也会运行大约半秒 对于以 TDD
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何在Java中打印保留2位小数的浮点数?

    我可以用System out print 您可以使用printf http java sun com j2se 1 5 0 docs api java io PrintStream html printf 28java lang Strin
  • 如何在 JdbcTemplate 中创建 mySQL 存储过程

    背景 为了解决 MySql 中某些语句只允许在存储过程中出现的问题 我尝试在 JdbcTemplate 提交的 sql 中创建 运行然后删除存储过程 一个简单的例子是 这恰好是在 Spring Boot 中 Service public c
  • 无法自动装配 org.springframework.mail.javamail.JavaMailSender

    尝试运行我的应用程序时遇到以下问题 所有的东西都调试过了 还是一无所获 IDE 毫无问题地找到了 bean 所以我对这里发生的情况感到非常困惑 SEVERE Exception sending context initialized eve
  • selenium webdriver 中的多个程序执行不起作用

    Selenium WebDriver 中的多个程序执行不起作用 我编写了 1 个 testNG xml 文件和 2 个 java 类 我尝试从 xml 文件运行这两个 java 类 但这不起作用 XML代码
  • Java 不可变对象 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在学习不变性的概念 据我了解 一旦创建对象 不可变对象就无法更改其值 但我不明白不可变对象的以下用途 They are 自动是线程
  • 如何在Java中模拟引用传递?

    我是一个十足的 Java 菜鸟 我知道 Java 将所有参数视为按值传递 并且还有其他几个线程人们对此进行了解释 例如 在 C 中我可以这样做 void makeAThree int n n 3 int main int myInt 4 m
  • 如何列出hadoop hdfs中目录及其子目录中的所有文件

    我在 hdfs 中有一个文件夹 其中有两个子文件夹 每个子文件夹大约有 30 个子文件夹 最后 每个子文件夹都包含 xml 文件 我想列出所有 xml 文件 仅给出主文件夹的路径 在本地我可以这样做apache commons io 的 h
  • Spring Transactional 减慢了整个过程

    我正在尝试分析我有两堂课的情况 其中一个类是 ProcessImpl 它是起点并在内部调用其他子事务 我不知道出了什么问题 processImpl正在导入一些东西并将相关数据写入数据库 Specs Spring orm版本 3 2 18 发

随机推荐

  • Indy 10 TCP 服务器

    经过大量搜索后 我认为 Indy TCP 服务器最适合在我正在开发的即时通讯服务器上使用 我现在面临的唯一问题是向其他连接的客户端广播和转发消息 向同一客户端发回响应似乎没问题 并且不会挂起其他客户端活动 但对于将消息转发到其他客户端 我知
  • 如何用逗号分隔数组的值以进行显示

    我搜索了 PHP net 网站 最初想到了一些用途list 功能但似乎没有实现目标 我在单个数组中存储了未知数量的值 array1 array 1 2 3 4 5 or array1 array 1 2 3 我希望能够回显 或print r
  • 在 Android 上使用 Kotlin 共享 Intent 文本

    我想分享我的文本CardView使用 kotlin 使用共享 Intent 但 kotlin 代码中的最后一行有问题 代码 val shareIntent Intent shareIntent action Intent ACTION SE
  • 是否可以/正确地在一个页面中以两种不同的形式使用多个 @Html.AntiForgeryToken() ?

    我一直面临着严重的问题 Html AntiForgeryToken 我有一个注册控制器 它有一个创建视图来创建 注册新成员 因此我使用了 Html AntiForgeryToken 在我的主提交表单中不使用任何 SALT 现在 我想在用户名
  • 在 mac 中总是出现 zsh: command not found: [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在使用 z Shell zsh 而不是默认的 bash 并且发生了一些错误 导致所有曾经有效的命令不再被识别 ls zsh command not found ls open e
  • R - ggplot - geom_bar 的圆形末端

    这是我的条形图的一个简单示例 x lt data frame aa c 0 2 0 6 0 1 dd c 1 2 3 x lt melt x dd y lt data frame bb c 0 4 0 5 dd c 1 2 y lt mel
  • 通过 Lambda 集成保护 AWS API 网关

    我正在使用 API Gateway 创建一个公开可用的 API 该 API 由 lambda 函数支持来进行一些处理 我使用自定义安全标头来保护它 该标头实现带有时间戳的 hmac 身份验证 以防止重放攻击 据我了解 API Gateway
  • 请求被中止:无法创建 SSL/TLS 安全通道

    我的客户向我报告了他们的 SSL 和 Internet Explorer 的问题 他们表示 在访问该 URL 时会遇到信任问题 我正在通过 HTTPS 访问 JSON 该网站位于一台服务器上 我正在本地计算机上使用控制台应用程序 我试图绕过
  • Discord.js 13channel.join不是一个函数

    我最近安装了 Discord js 13 1 0 但我的音乐命令坏了 因为 显然 channel join 不是一个函数 尽管我已经在 12 5 3 上使用它几个月了 有人知道解决这个问题吗 我的加入命令的某些部分 const channe
  • PyCharm 未将源根目录添加到“sys.path”

    在 PyCharm 的运行配置中 我检查了以下两项 Add content roots to PYTHONPATH Add source roots to PYTHONPATH 但我无法导入相对于我的源根目录的文件 这是 PyCharm 的
  • numactl --physcpubind

    我使用的是 numactl 带有 physcpubind 选项 手册说 physcpubind cpus C cpus Only execute process on cpus Etc 假设我的 NUMA 系统有 3 个 NUMA 节点 每
  • Android:用透明度覆盖图片(jpg)

    I have a picture jpg that I want to display on the screen Additionally the picture should be covered partially by a tran
  • React.children.only 期望接收单个 React 元素子导航器

    我尝试了太多的主题帮助 但这并不能帮助我解决这个错误 也许因为我是反应原生的新手 这是给出错误的代码 render return
  • 在哪里可以找到 Mac OS 的 jni 标头

    我不是问在哪里可以找到它我自己的电脑 我想问一下哪里可以买到 我已经完成了谷歌作业 但没有在这些路径中找到标题 我的 System Library Java JavaVirtualMachines 中甚至没有 Header 文件夹 而且我的
  • 如何使 SecPKCS12Import 正确导入有效的 p12 文件

    我已经解决了之前将 XML RSA 私钥转换为 PEM 文件的问题 但遇到了另一个问题 即在导入 P12 私钥时得到空数据 以下是我的步骤 将 PEM 文件转换为 P12 文件 openssl gt pkcs12 export in rsa
  • Javascript 拦截的“Ctrl+O”无法打开我的文件对话框

    我有一个
  • 嵌套的 app.config (web.config) 文件

    是否可以有两个 app config 文件 其中一个 app config 作为第二个 嵌套 app config 文件的容器 我想从外部文件引用嵌套文件的特定部分 为什么我需要这个是因为源代码控制问题 详细描述参见this 任何其他解决根
  • 如何将 ko.validation 错误与相关视图模型字段名称联系在一起

    我正在使用 Knockout Validation 我希望能够显示错误摘要 其中每行显示错误消息 显然 以及与其相关的视图模型上的字段名称 例如 年龄 请输入数字 出生日期 请输入正确的日期 到目前为止 我已经有了一个 validObser
  • Java中的前后自增

    我只是想创建一个小小的 Java Puzzle 但我自己也感到困惑 谜题的一部分是 下面这段代码的作用是什么 public class test public static void main String args int i 1 i i
  • try、catch 和finally 的确切执行顺序是什么?

    在这段java代码中 import java io IOException public class Copy public static void main String args if args length 2 System err