精华内容
下载资源
问答
  • 一般情况下,资源(如文件或 socket 句柄)封装在对象中,使用后必须关闭才能释放资源。通常开发人员责任关闭自己所创建的资源,以避免资源冲突,一般都会放在 finally 语句块中处理。不这样做其实也不会产生编译...

    80574d51dae643019f55a63c39f0232a.png

    码农每日一题长按关注,工作日每天分享一个技术知识点。ed4b83a466518567993e0ffbf7d33164.png

    当通过 Java 实现业务实例时,对资源进行处理是司空见惯的。一般情况下,资源(如文件或 socket 句柄)封装在对象中,使用后必须关闭才能释放资源。通常开发人员有责任关闭自己所创建的资源,以避免资源冲突,一般都会放在 finally 语句块中处理。不这样做其实也不会产生编译错误,但很容易导致资源泄露。虽然现在静态代码检查工具足够聪明,也可以做出提示。但不是每个人都使用工具,而且这些警告也容易被忽略。

    Java 7 中首次引入了一种新的处理(关闭)资源的方式 —— try-with-resources。它使得在 try-catch 语句块中的资源能按照正确顺序自动关闭,更加容易地处理资源。

    我们来一起看一个业务实例的实现,其需要从数据库中获取指定账户的状态码。首先可以看到它是如何以传统方式实现,紧接着是足智多谋的 try-with-resources 如何实现。最后,还将看到 Java 9 引入的更加简洁的版本。

    传统的方式处理资源(Java 7 之前)

    // 代码已简化,只保留跟眼下话题相关的内容。
    public static int getAccountStatusCodeFromDataStore_traditional(String accountId) throws SQLException {
      String accountStatusCodeQuery = getAccountStatusCodeQuery(accountId);
      Statement statement = null;
      ResultSet resultSet = null;
      try {
        statement = createStatementFromConnection();
        resultSet = statement.executeQuery(accountStatusCodeQuery);
        return getAccountStatusCodeFromResultSet(resultSet);
      } finally {
        if (resultSet != null)
          resultSet.close();
        if (statement != null)
          statement.close();
      }
    }

    如上所示,我们必须增加 finally 语句块来处理资源关闭。在调用 close 方法之前,须显示地检查 null 值,并且同时要保证关闭资源的逻辑顺序。代码不但变得冗长,而且我们曾经遇到过许多开发人员会忘记编写 finally 语句块来关闭资源,导致资源泄露的情况。

    顺便提一下,假如 try 和 finally 语句块都抛出异常,finally 语句块抛出的异常会屏蔽对方。

    Java 7/8 中通过 try-with-resources 处理资源

    现通过 try-with-resources 实现与上面相同的代码块,如下所示:

    // 代码已简化,只保留跟眼下话题相关的内容。
    public static int getAccountStatusCodeFromDataStore_tryWithResourcesJava7(String accountId) throws SQLException {
      String accountStatusCodeQuery = getAccountStatusCodeQuery(accountId);
      try (Statement statement = createStatementFromConnection();
           ResultSet resultSet = statement.executeQuery(accountStatusCodeQuery)) {
        return getAccountStatusCodeFromResultSet(resultSet);
      }
    }

    在本例中可以看到简洁的代码有助于提高整体可读性,资源管理也自动完成。try-with-resources 语句中可以包含多个资源,它们之间应通过分号隔开。资源会在保持逻辑顺序的前提下自动关闭(最后声明的将第一个关闭)。

    如果在 try-with-resources 和 try 语句块中抛出异常,从 try 中抛出的异常将会屏蔽对方。假如有需要,可从 try 语句块抛出的异常中,通过调用 Throwable.getSuppressed 方法找回屏蔽的异常。

    try-with-resources 语句中也可以写 catch 和 finally 语句块。任何 catch 和 finally 语句块会在声明的资源关闭后运行。

    Java 9 中通过 try-with-resources 处理资源

    Java 9 中引入了更加简练的版本。如果已经把资源声明为 final 或 effective final,则在 try-with-resources 中无需创建任何新的变量,可直接使用。这使得能够利用自动资源管理。现通过更简洁的 try-with-resources 语句来实现与上面相同的代码块,如下所示:

    // 代码已简化,只保留跟眼下话题相关的内容。
    public static int getAccountStatusCodeFromDataStore_tryWithResourcesJava9(String accountId) throws SQLException {
      String accountStatusCodeQuery = getAccountStatusCodeQuery(accountId);
      // 显示地声明 final 
      final Statement statement = createStatementFromConnection();
      // effective final
      ResultSet resultSet = statement.executeQuery(accountStatusCodeQuery);
      try (statement; resultSet) {
        return getAccountStatusCodeFromResultSet(resultSet);
      }
    }

    幕后如何运行

    Java 7 引入了专门设计用于 try-with-resources 语句的 AutoCloseable 接口。Java 5 引入的 Closeable 接口也修改为继承 AutoCloseable 接口。这两个接口都拥有抽象的 close 方法,资源应该实现它并提供有效的方法。任何实现 AutoCloseable 和 Closeable 接口的资源都可以通过 try-with-resources 来关闭。所有基于 JDK 资源的类和接口都已修改成继承这两个接口其中之一,使之能与现有的 try-with-resources 语句兼容。

    然而,若处理的资源没有实现 AutoCloseable 或 Closeable 接口,则必须使用传统的方法来关闭。

    关键要点

    try-with-resources 有助于自动资源管理,不需要编写显示的 finally 语句块来处理关闭资源。下面是对 try-with-resources 关键点的总结:

    • 有助于实现简练清晰的代码。

    • 可以在 try-with-resources 语句中同时处理多个资源。

    • 在 Java 7/8 ,try-with-resources 语句中必须声明要关闭的资源。通过这种方式声明的资源属于隐式 final。

    • Java 9 中甚至能使用预先创建的资源,只要所引用的资源声明为 final 或者是 effective final。

    • 在幕后施展魔法的是 AutoCloseable 或者 Closeable 接口,它们与 try-with-resources 语句协同工作。

    • JDK 中大多数基于资源的类和接口已修改成实现 AutoCloseable 或 Closeable 接口,使它们能与现有的 try-with-resources 兼容。

    • 可以使自定义的资源实现 AutoCloseable 或 Closeable 接口,以便能够在 try-with-resources 语句中使用。

    更多相关历史推送:

    《Java 异常(Part 1)相关面试题》

    《Java 异常(Part 2)相关面试题》

    《Java 异常(Part 3)相关面试题》

    翻译:PJing

    译文链接:http://www.importnew.com/30000.html

    原文链接:https://dzone.com/articles/java-code-bytes-be-resourceful-with-try-with-resou

    29b8e6d5ccd6b290b061289e972fc814.gif

    7c7950bc564aca7937f8a430568679ca.png看完顺手 Option 咯~

    ▼往期精彩回顾▼HashMap 的这些问题只想说句妈卖批!面试中用飞鸽传书来解释  HTTPS 机制

    9fbdf63cb99a049460ca8ffb34bd5b49.png本号主打短小精干,点击左下角阅读原文查看历史经典题目汇总~

    展开全文
  • 掌握下面几条原则就可以完全解决“当trycatch、finally遭遇return”的...2、函数执行完try块中的return语句不会终止,还会继续执行catch(仅在抛出异常时执行)、finally语句块。 3、函数必须确保唯一返回...

    掌握下面几条原则就可以完全解决“当try、catch、finally遭遇return”的问题。

    原则:1、finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行。

               2、 函数执行完try块中的return语句后不会终止,还会继续执行catch(仅在抛出异常时执行)、finally语句块。

               3、函数必须确保有唯一返回值

    说明: try中如果包含return语句则catch块和finally块中必须至少有一个含有return语句。或者try中通过throw new Exception();抛出异常,则catch与finally中至少有一个return语句。因为try块会假定其中发生异常,且try块中的代码要么顺利执行,要么抛出异常。如果只在try块中包含return语句不能保证函数有返回值(如try抛出时,return语句不会执行)。所以为了保证函数具有返回值,java强制要求原则。

               4、return语句的优先级是finally最大,且try与catch块中只有两者之一的return语句会被执行。为保证函数只有一个返回值则返回优先级最大的值。

     

    java 的异常处理中,
    在不抛出异常的情况下,程序执行完 try 里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有 finally 的代码块,
    如果没有 finally 代码块,整个方法在执行完 try 代码块后返回相应的值来结束整个方法;
    如果有 finally 代码块,此时程序执行到 try 代码块里的 return 语句之时并不会立即执行 return,而是先去执行 finally 代码块里的代码,
    若 finally 代码块里没有 return 或没有能够终止程序的代码,程序将在执行完 finally 代码块代码之后再返回 try 代码块执行 return 语句来结束整个方法;
    若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return。
    在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就 OK 了 *_*

     

    http://blog.csdn.net/lu_ca/article/details/52184423

    http://www.cnblogs.com/changkai244/p/4108768.html

    http://blog.csdn.net/kavensu/article/details/8067850

    转载于:https://www.cnblogs.com/ziq711/p/7248521.html

    展开全文
  • 对于try-catch也是一样,如果只有在try块里才初始化语句,编译部通过。如果在catch或finally里也,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始...
  • // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); // 发送请求...
  • // SurfaceHolder.Callback必须实现的方法 public void surfaceCreated(SurfaceHolder holder){ mCamera = getCameraInstance(); try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } ...
  • //刷新此输出流并强制写出所有缓冲的输出字节,必须这行代码,否则可能问题 bout.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { bout.close(); fout.close(); ...
  • 38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...
  • 超级影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...
  • AJAX应用的通用流程

    2009-07-27 16:40:35
    了上面的基础知识,我们来看看一些具体的例子。XMLHttpRequest 是 AJAX应用程序的核心,而且对很多读者来说可能还比较陌生,我们就从这里开始吧。从 清单 1 可以看出,创建和使用这个对象非常简单,不是吗?等...
  • java 面试题 总结

    2009-09-16 08:45:34
    1、面向对象的特征哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括...
  • java面试题典 java 面试题 经典

    热门讨论 2010-06-18 13:42:36
    28. try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 12 29. 两个对象值相同(x.equals(y) == true),但却可不同的hash code,这句话对不对? ...
  • 图书关管理系统

    2013-12-28 15:22:50
    }catch(Exception ee){System.out.println("散列表问题!");}if(Shashtable.containsKey(number)){update.setEnabled(true);Student stu=(Student)Shashtable.get(number);Jname.setText(stu.getName());...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...
  • Java面试宝典-经典

    2015-03-28 21:44:36
    38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...
  • 43.try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 答:会执行,在return前执行。 44.两个对象值相同(x.equals(y) == true),但却可不同...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 39、下面的程序代码输出的结果是多少? 40、final, finally, finalize的区别。 41、...
  • Java面试宝典2012版

    2012-12-03 21:57:42
    38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 ...
  • java面试宝典2012

    2012-12-16 20:43:41
    38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 27 39、下面的程序代码输出的结果是多少? 28 40、final, finally, finalize的区别。 30 ...
  • 38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...
  • Java面试宝典2012新版

    2012-06-26 19:20:00
    38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...
  • Java面试笔试资料大全

    热门讨论 2011-07-22 14:33:56
    38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...
  • jedis使用指南

    2015-07-13 18:10:32
    这里我进行了20w次连续操作(10w读,10w写),不用pipeline耗时:187242ms,用pipeline耗时:1188ms,可见使用管道的性能上了一个台阶。看了代码了解到,管道通过一次性写入请求,然后一次性读取响应。也就是说...
  • C#语法及存储过程.docx

    2019-08-08 11:00:43
    首先,ArrayList集合和List都是非静态类,使用时都必须先实列化。 ArrayList类似一个数组,但比数组优越的是它的长度大小可变,并且可以存放不同类型的变量,包括值类型和引用类型。 常用方法如下: 1、Add():...
  • JAVA面试宝典2010

    2011-12-20 16:13:24
    38、try {}里一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 25 39、下面的程序代码输出的结果是多少? 25 40、final, finally, finalize的区别。 27 ...
  • * 二、菜单(JMenu) 在添加完菜单条,并不会显示任何菜单,所以还需要在菜单条中添加菜单。菜单 * JMenu 类的构造方法4种: JMenu() 构造一个空菜单。 JMenu(Action a) * 构造一个菜单,菜单属性由相应...
  • 这个是中国期刊网的检索请求,我现在...左边的条件没有传过去,也就是分类信息没有传过去,分类信息是必须的。 这位大哥,谢谢了。。我知道分类信息,现在就是不知道怎么加这个分类信息,你能帮我看看吗?
  • JAVA面试题最全集

    2010-03-13 13:09:10
    50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52.一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握...
  • * 如果需要播放就必须加入一些格式或者编码的头信息。但是这样的好处就是你可以对音频的 裸数据进行处理,比如你要做一个爱说话的TOM * 猫在这里就进行音频的处理,然后重新封装 所以说这样得到的音频比较容易做...
  • >JDBC<->ODBC桥->ODBC->数据库客户机驱动库->数据库服务器->返回查询结果,在这种访问中值的我们注意的是虽然JAVA是"Write Once ,Run Anywhere",但是如果通过这种访问的话,需要客户端必须设置ODBC和相应的数据库...

空空如也

空空如也

1 2 3
收藏数 45
精华内容 18
关键字:

try后必须有catch吗